我有一个泛型方法T foo(T),它根据参数的实际类型执行不同的操作。下面的例子说明了同样的问题。(有关我在代码中实际做了什么,请参见下面的描述。)
<T extends Number> T foo(T a) {
if (a instanceof Integer) {
return ((Integer) a) + 1;
} else if (a instanceof Double) {
return ((Double) a) + 1;
} else {
throw new IllegalArgumentException();
}
}这并不违反返回类型的要求,但javac不接受。问题是,例如,return ((Integer) a) + 1;只有在T是Integer时才能执行,但是编译器不能(根据JLS)推断这一点,因此期望将T传递给return。那里的表达式类型为int,不能转换为T。
是否有办法处理这种情况而不诉诸未经检查的演员?
实际上,我在代码中所做的是:在应用程序中,有一个通用接口,用于封装一些值。对于不同的值类型,该接口有不同的专门实现,我试图编写的方法应该动态地选择正确的实现。
发布于 2014-12-01 18:01:31
如果您在运行时对a进行类型检查,那么您就违背了泛型的观点。但是泛型无论如何都不适用于数学运算符,因为这些运算符处理原语,类型参数与引用类型一起工作。您的解决方案不适用于编译器,因为T在编译时可能是任何Number类型,所以编译器不能允许您在认为Integer可以是任何Number类型时返回它。
相反,我将重载两个非泛型foo方法--一个使用int,另一个使用double。这两个方法都不是通用的,每个方法都只执行自己的操作。
发布于 2014-12-01 18:02:23
这不是正确使用仿制药。你应该用方法过载代替
https://stackoverflow.com/questions/27234302
复制相似问题