2013-03-09 3 views
4

У меня есть универсальный метод для создания экземпляра объекта следующим образом:я неоднозначность с общим методом

@Override 
public <T> T createRawObject(Class<?> raw_type, 
          ProviderParam param) 
{ 
    SpringProviderParam spring_param = (SpringProviderParam) param; 
    ApplicationContext ctx = SpringContextGenericProvider.getInstance() 
                 .generate(param, 
                    ApplicationContext.class, 
                    (Object[]) spring_param.getContextPaths()); 
    ValidateUtility.notNull(ctx, "Target Application_Context is null"); 


    T raw_object= (T) ctx.getBean((spring_param.getBeanName()!=null)?spring_param.getBeanName():raw_type); 

    ValidateUtility.sameType(raw_object, raw_type, "Target object isn't instance of a {} class", raw_type); 

    return raw_object; 
} 

Моя проблема заключается в следующей строке:

T raw_object= (T) ctx.getBean((spring_param.getBeanName()!=null)?spring_param.getBeanName():raw_type); 

эта линия не скомпилированный и шоу после ошибки компиляции:

The method getBean(String) in the type BeanFactory is not applicable for the arguments (Serializable) 

, но когда я изменяю эту строку на следующие строки и скомпилировал штраф:

T raw_object= null; 
if(spring_param.getBeanName()!=null) 
    raw_object= (T) ctx.getBean(spring_param.getBeanName()); 
else 
    raw_object= (T) ctx.getBean(raw_type); 

I неоднозначность с этой проблемой.

ответ

6

Проблема заключается в том, что компилятор не может определить, какой метод вы пытаетесь вызвать в первом фрагменте, потому что ваш тернарный оператор возвращает разные типы объектов, поэтому вы получаете ошибку компиляции, потому что вы можете получить компоненты из контекста, используя разные методы (по имени - String, по классу - класс).

Предположим, что вы пытаетесь установить значение

(spring_param.getBeanName()!=null)?spring_param.getBeanName():raw_type 

любой переменной, вы должны указать компилятору, какой тип будет переменная. Здесь вы можете ничего не использовать для своего типа переменной, но Object class, потому что у них нет другого общего предка (я имею в виду классы String и Class).

3

Проблема заключается в том, что компилятор передает тип, возвращаемый тернарным оператором, и поэтому он не может выбрать, какой метод вызывать в контексте приложения.

Смежные вопросы