繁体   English   中英

在列表上使用addAll() <? extends 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> List<? extends Number>应该被读为元素类型扩展Number一些列表 因此,在运行时, a可以是List<Long>b可以是List<BigInteger> 在这种情况下, a.addAll(b)意味着“将所有BigIntegers添加到Longs列表中”,如果允许的话,显然不是安全的类型。

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> List<? extends Number>表示

此列表中的项目具有相同的类别。 它们不仅扩展Number,而且都是同一类型。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM