为什么不编译?
List<? extends Number> a = new ArrayList<>();
List<? extends Number> b = new ArrayList<>();
a.addAll(b);
答案 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 ?
和?
是否指向同一个类。