在Number的通用子类上使用加法运算符

时间:2012-11-05 00:17:44

标签: java generics

有人能告诉我为什么这段代码会给我一个编译错误吗?

public class Main {

    public static void main(String[] args) {
        System.out.println(sum(2, 6.9));
    }

    public static <T extends Number<T>> T sum(T a, T b) {
        T result = a + b;      // compile-error here
        return result;
    }
}

4 个答案:

答案 0 :(得分:5)

Number不是通用类,因此您无法对其进行参数化:

public abstract class Number implements java.io.Serializable {
...
}

此外,+运算符仅适用于基本类型,如intlong等,而不是Number类型Integer,{Long 1}}等等(编辑:它将通过拆箱操作,是的,但它不能自动将结果包装在适当的包装类中。)

(你偶然发现Number是多态性的一个不好的例子的原因之一。它实际上只执行对象到原始的转换。)

答案 1 :(得分:2)

您可以使用

创建界面
public interface ALU  <T extends Number> {

    public  T add(T a, T b);
}

让你的主类实现创建的界面。

public class Main implements ALU <Integer>.

在主类中创建方法add。

public Integer add(Integer a, Integer  b){
        return a + b;
    }

这将有效。

答案 2 :(得分:1)

你必须使用:

a.doubleValue()+b.doubleValue()

由于Number是一个类,不支持operator +

答案 3 :(得分:0)

错误The operator + is undefined for the argument type(s) T, T是由The type Number is not generic; it cannot be parameterized with arguments <T>

引起的

eclipse中突出显示的错误提供了此信息,不确定其他IDE是否提供相同的信息。