java中的有界类型

java中的有界类型,java,generics,bounded-types,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

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

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);
        }
    }
}
公共教室{
公共静态void main(字符串[]args){
双[]ar={1.1,2.23,3.56,4.23,5.90,6.88,7.99,8.09,9.88,10.99};
平均tt=新平均值(ar);
tt.summ();
}
}
班级平均{
T[]arr;
T和;
平均值(T[]num){
arr=num;
}
无效总和(){
对于(TI:arr){
sum=sum+i;//显示不兼容的类型
系统输出打印项数(总和);
}
}
}
编译器错误状态为:

Room.java第18行出错:

类型不匹配:无法从双精度转换为T


有人能解释一下为什么这段代码没有编译吗???

这个泛型类型参数没有这个界限:

class Average<T extends Double>
类平均值
因为Double是final,不能有子类型


因此,您最好删除泛型类型参数T,并用Double everywhere替换T。

因为我不知道您的代码应该归档什么,所以我不确定这个答案是否正确,但一个快速修复方法(至少可以避免语法错误)是替换以下行:

T sum;
与:


这样,您的输出就是所有双精度的增量总和,一个接一个。

Eran是正确的
java.lang.Double
final
,因此使用类型参数
T extensed Double
是没有意义的。满足这一点的唯一可能类型是
Double
本身,因此您也可以删除类型参数,直接使用
Double
(或者更好的是:原语类型
Double

代码无法编译的原因是您试图对类型为
t
的对象使用
+
运算符

Java编译器不是很聪明,它注意到
T
只能是
Double
,因此它可以自动(通过自动取消装箱和装箱)将值转换为
Double
,以进行计算


<>你可能来自C++背景,你使用C++模板。java泛型与C++模板不一样工作;Java中的泛型类型不是生成代码的模板。

+
是用于数字或字符串的算术运算符,但不能用于
对象
类型。如果要使用
+
运算符,两个操作数应具有相同的类型

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

  void summ() {
    for (T i : arr) {
      sum += (Double)i;//Shows incompatible types
      System.out.println(sum);
    }
  }
}
类平均值{
T[]arr;
双和=0;
平均值(T[]num){
arr=num;
}
无效总和(){
对于(TI:arr){
sum+=(Double)i;//显示不兼容的类型
系统输出打印项数(总和);
}
}
}

String args[]请在类型上写括号,而不是变量,因为它属于该类型。此外,请包括编译错误。@Turing85-不,这不是解决方案…仍然没有编译。您甚至没有包括错误。@RajMalhotra我知道这不是解决方案。这只是对您的编码风格的评论。为了解决您的问题,我们需要实际的编译错误。@Eran,但是为什么代码没有编译?。在这种情况下,OP可能希望用
double
替换
T
,而不是
double
,这样可以消除编译错误。@Eran,但为什么代码没有编译?。即使我写,然后还展示了它的编译error@CodebenderOP的代码给出了一个编译错误-
类型不匹配:无法在
sum=sum+i行上从double转换为T
class Average<T extends Double> { T[] arr; double sum = 0; Average(T[] num) { arr = num; } void summ() { for (T i : arr) { sum += (Double)i;//Shows incompatible types System.out.println(sum); } } }