如何在Java中使用泛型语言运算符和扩展Number的泛型类

时间:2011-07-06 18:12:23

标签: java generics operators

我想对两个扩展Number的相同类型的泛型参数执行操作。

可能吗? 我总是习惯在泛型参数上调用方法,但似乎使用运算符存在一些问题(对于参数类型T,T,运算符+未定义。)

public static <T extends Number> T sum(T a, T b){
    return a+ b;
}

我做错了什么?

编辑: 我试着改善一点我的问题。我知道运营商没有为Number类型定义。这件事有点让人伤心,因为在不引入@Victor Sorokin建议的新界面的情况下执行这样的操作会很好。

但我仍然不明白一件事:如果运算符没有在Number类中实现,那么至少在Double类中应该实现,因为我可以使用+运算符和double。 这些代码行都不会编译:

public static <T extends Double> T sum(T a, T b){

    T c = a +b;
}

为什么?

2 个答案:

答案 0 :(得分:4)

这是不可能的,因为Number没有与之关联的+运算符。特别是,你不能这样做:

Number a = new Integer(1);
Number b = new Integer(2);
Number c = a + b;

答案 1 :(得分:2)

Java中的类没有+运算符(String除外,当其中一个参数为String时,通过toString()隐式转换其他类型)。所以,让你输入一些接口,比如说

interface Valuable {
    // use richest built-in numeric type
    double value();
    Valuable value(double v);
}

public static <T extends Valuable> T sum(T a, T b){
    return a.value(a.value() + b.value());
}
丑陋,不是吗? = d