java中的有界类型

Viv*_*mar 3 java generics bounded-types

我无法理解为什么这段代码没有编译......

public class Room {
    public static void main(String[] args) {
        Double[] ar = {1.1,2.23,3.56,4.23,5.90,6.88,7.99,8.09,9.88,10.99};
        Average<Double> tt = new Average<>(ar);
        tt.summ();
    }
}

class Average<T extends Double> {
    T[] arr;
    T sum;
    Average(T[] num) {
        arr = num;
    }

    void summ() {
        for (T i : arr) {
            sum = sum + i;//Shows incompatible types
            System.out.println(sum);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器错误说明:

Room.java第18行出错:

类型不匹配:无法从double转换为T.

有人可以解释为什么这段代码没有编译?

Jes*_*per 5

伊兰是对的; java.lang.Double是的final,所以拥有一个类型参数是没有意义的T extends Double.satiesfies这是唯一可能的类型Double本身,所以你也可以删除type参数并直接使用Double(或者更好:原始类型double).

您的代码无法编译的原因是您尝试+在类型的对象上使用运算符T.

Java编译器并不那么聪明,它T只能注意到它Double,因此它可以自动转换(通过自动拆箱和分箱)将值转换为a double来进行计算.

也许你来自C++背景,你已经使用过C++模板.Java泛型与C++模板的工作方式不同; Java中的泛型类型不是生成代码的模板.