我对一般方法不明确

时间:2013-03-09 08:49:47

标签: java generics compiler-errors

我有一个用于实例化对象的通用方法如下:

@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);

我对这个问题不明确。

2 个答案:

答案 0 :(得分:6)

这里的问题是编译器无法检测到你试图在第一个片段中调用哪个方法,因为你的三元运算符返回不同类型的对象,因此你得到编译错误,因为你可以使用不同的方法从上下文中获取bean (按名称 - 字符串,按类 - 类)。

假设您正在尝试设置

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

对任何变量,你必须告诉编译器哪个类型将是你的变量。您可以在此处使用任何类型的变量类型,但Object class,因为它们没有任何其他共同的祖先(我的意思是StringClass类)。

答案 1 :(得分:3)

问题在于编译器推断出由三元运算符返回的类型,因此它无法选择在应用程序上下文中调用哪个方法。