![](/img/trans.png)
[英]What is the difference between public <T extends Animal> void addAll(List<T> animals) and public void addAll(List<Animal> animals)?
[英]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.