在 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(...)
为什么这个编译不了?
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(...)