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

Using addAll() on List<? extends E> a and b doesn't work

为什么这个编译不了

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

因为不安全。

List<? extends Number> 应理解为 元素类型扩展 Number 的列表。所以在运行时 a 可能是 List<Long>b 可能是 List<BigInteger>。在那种情况下,a.addAll(b) 将意味着 "add all BigIntegers to the list of Longs",如果允许,显然不会是类型安全的。

List<? extends Number> 表示

Items in this List have all the same class. Not only do they extend Number, but are all the same type.

由于编译期间的类型擦除,字节码解释器不知道(也无法推断)a 的 ?? 是否引用相同的 class .

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

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

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