1

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

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

4 回答 4

5

Number不是泛型类,所以你不能参数化它:

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

此外,该+运算符仅适用于 , 等原始类型intlong而不适用于,等Number子类型。(编辑:它将通过取消装箱对这些类型进行操作,是的,但它不能自动将结果装箱到适当的包装类中。)IntegerLong

(你偶然发现了一个原因Number是多态性的一个糟糕的例子。它实际上只执行对象到基元的转换。)

于 2012-11-05T00:24:18.123 回答
2

您可以改为创建一个接口

public interface ALU  <T extends Number> {

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

并使您的主类实现所创建的接口。

public class Main implements ALU <Integer>.

并在您的主类中创建方法添加。

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

这将起作用。

于 2012-11-05T00:46:50.453 回答
1

错误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 是否提供相同的信息。

于 2012-11-05T00:22:02.430 回答
1

你必须使用:

a.doubleValue()+b.doubleValue()

因为 Number 是一个类,不支持运算符 +

于 2012-11-05T00:27:44.363 回答