在List <! - 上使用addAll()?扩展E - > a和b不起作用

时间:2015-02-07 18:32:18

标签: java generics collections

为什么不编译

List<? extends Number> a = new ArrayList<>();
List<? extends Number> b = new ArrayList<>();
a.addAll(b);

3 个答案:

答案 0 :(得分:3)

因为它不安全。

List<? extends Number>应该被理解为某些列表,其中元素类型扩展为Number 。因此,在运行时a可以是List<Long>b可以是List<BigInteger>。在这种情况下,a.addAll(b)意味着&#34;将所有BigIntegers添加到Longs&#34;如果允许的话,显然不会是类型安全的。

答案 1 :(得分:1)

https://google.github.io/guava/releases/19.0/api/docs/com/google/common/collect/Iterables.html

对我来说真正有用的是番石榴:

com.google.common.collect.Iterables.concat(...)

答案 2 :(得分:0)

List<? extends Number>表示

  

此列表中的项目具有相同的类别。它们不仅延伸   数字,但都是相同的类型。

由于编译期间的类型擦除,字节码解释器不知道(并且无法推断),a ??是否指向同一个类。