算术与通用数字

时间:2014-11-10 19:30:18

标签: java generics

所以我必须接受一个泛型类型T,它将是一个数字原语的包装类,并对它进行一些算术运算。我认为这将是微不足道的,因为自动装箱和拆箱:

T newval = val1*val2;

(其中val1和val2已经是T类型的变量,其中包含适当的值。)

但事实证明,如果Java在编译时没有明确知道类型,那么它将不会取消装箱值。我还以为我可以使用multiply方法,每个Number子类(我打算使用)都在其中。所以我用:

宣布我的班级
public class SomeClass<T extends Number> {
    // ...
}

然后:

T newval = val1.multiiply(val2);

但这不起作用,因为我猜不是所有子类的数字都是必需的(为什么他们不使用这个接口?)来拥有那个方法(但是我想要使用的所有那些DO。)

我已经看到了一些类似的问题,但是他们都告诉OP不要使用泛型,但我必需使用泛型来完成我正在做的工作,否则整个事情没有价值。任何人都能想到一个对我有用的解决方案吗?

修改 好的,所以他回到我身边并澄清了它的意思,它的不同之处在于我的问题与我正在做的事情不再相关。谢谢你们。

1 个答案:

答案 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
    }
}

使用运算符的实现必须在知道实际类型的子类中。