java中的有界类型

时间:2015-07-04 12:27:23

标签: 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);
        }
    }
}

编译器错误说明:

  

Room.java第18行出错:

     

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

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

4 个答案:

答案 0 :(得分:5)

伊兰是对的; java.lang.Doublefinal,因此拥有类型参数T extends Double毫无意义。唯一可能的类型是Double本身,所以您也可以删除type参数并直接使用Double(或者更好:原始类型double)。 / p>

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

Java编译器并不那么聪明,它注意到T只能是Double,因此它可以自动转换(通过自动拆箱和转箱)值到{{1进行计算。

也许您来自C ++背景并且您使用过C ++模板。 Java泛型与C ++模板的工作方式不同; Java中的泛型类型不是生成代码的模板。

答案 1 :(得分:3)

此泛型类型参数中没有任何关系具有此限制:

class Average<T extends Double>

因为Double是最终的,并且没有子类型。

因此,您不妨删除泛型类型参数T并将Double替换为Double。

答案 2 :(得分:0)

由于我不知道你的代码应该归档到底是什么,我不确定这个答案的正确性,但是快速修复(至少避免语法错误)就是替换该行:

T sum;

使用:

double sum;

这样,你的输出就是所有双倍的增量总和。

答案 3 :(得分:0)

+是与数字或字符串一起使用的算术运算符,但它不能与Object类型一起使用。如果要使用+运算符,则两个操作数应具有相同的类型。

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);
    }
  }
}