【发布时间】:2016-06-11 10:41:30
【问题描述】:
考虑sn-p:
Number[] numbers = {1, 2.3, 4.5f, 6000000000000000000L};
上面做完全没问题,Number是一个抽象类。
继续,
List<Long> listLong = new ArrayList<Long>();
listLong.add(Long.valueOf(10));
List<Number> listNumbers = listLong; // compiler error - LINE 3
listNumbers.add(Double.valueOf(1.23));
如果第 3 行被设计为编译成功,
我们最终会得到List 的Numbers,即,
for(Number num: listNumbers ){
System.out.println(num);
}
// 10
// 1.23
都是数字。
我在一本书中看到了这个,
泛型不支持子类型,因为它会导致 实现类型安全。这就是为什么
List<T>不被视为List<S>的子类型,其中S是T的超类型
在上面讨论的这种特定情况下,第 3 行是否会成功编译?
【问题讨论】:
-
查看这篇文章,了解为什么使用 Java generics are not covariant。
-
List<? extends Number>可以。它可以防止add。