所以我必须接受一个泛型类型T,它将是一个数字原语的包装类,并对它进行一些算术运算。我认为这将是微不足道的,因为自动装箱和拆箱:
T newval = val1*val2;
(其中val1和val2已经是T类型的变量,其中包含适当的值。)
但事实证明,如果Java在编译时没有明确知道类型,那么它将不会取消装箱值。我还以为我可以使用multiply方法,每个Number子类(我打算使用)都在其中。所以我用:
宣布我的班级public class SomeClass<T extends Number> {
// ...
}
然后:
T newval = val1.multiiply(val2);
但这不起作用,因为我猜不是所有子类的数字都是必需的(为什么他们不使用这个接口?)来拥有那个方法(但是我想要使用的所有那些DO。)
我已经看到了一些类似的问题,但是他们都告诉OP不要使用泛型,但我必需使用泛型来完成我正在做的工作,否则整个事情没有价值。任何人都能想到一个对我有用的解决方案吗?
修改 好的,所以他回到我身边并澄清了它的意思,它的不同之处在于我的问题与我正在做的事情不再相关。谢谢你们。
答案 0 :(得分:3)
各种算术运算符只能应用于可转换为基本类型的类型的值。没有办法用泛型来表达这个要求。因此,泛型不适合这项任务。
对于泛型方法,而是为数字基元类型提供重载。 对于泛型类,请提供使用特定数字类型的子类。
class NumericCalculator<T> {
public void calculate(T one, T two) {
T result = one * two; // compiler error
}
}
class LongCalculator extends NumericCalculator<Long> {
public void calculate(Long one, Long two) {
Long result = one * two; // yes
}
}
使用运算符的实现必须在知道实际类型的子类中。