我有一个通用的方法来实例化一个对象,如下所示:
@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);
我对这个问题有歧义。
最佳答案
这里的问题是编译器无法检测到您在第一个代码段中尝试调用哪个方法,因为您的三元运算符返回不同类型的对象,因此您会遇到编译错误,因为您可以使用不同的方法从上下文中获取 bean (按名称 - 字符串,按类别 - 类别)。
假设您正在尝试设置的值
(spring_param.getBeanName()!=null)?spring_param.getBeanName():raw_type
对于任何变量,您必须告诉编译器哪种类型将成为您的变量。除了 Object class
之外,您在这里不能使用任何变量类型,因为它们没有任何其他共同的祖先(我的意思是 String
和 Class
类).
关于java - 我对通用方法不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15308902/