使用 addAll() 编译器的 ArrayList 显示了泛型的不同行为
有人可以向我解释以下行为吗?
我有一个列表,并使用该方法添加元素。这些元素由使用泛型类型的方法返回。方法以类的形式返回。方法以接口的形式返回(请参阅下面的代码)。X
addAll()
getA()
< T extends A >
A
getI()
< T extends I >
I
区别:我得到一个编译错误(如预期),但编译(当元素被强制转换为时抛出运行时错误)。listX.addAll(getA())
listX.addAll(getI())
X
简化代码:
interface I {}
class A implements I {}
class X {}
public void test() {
List<X> listX = new ArrayList<>();
listX.addAll(getA());
listX.addAll(getI());
for (X x : listX) {}
}
public <T extends A> List<T> getA() {
return new ArrayList<>();
}
public <T extends I> List<T> getI() {
return new ArrayList<>();
}
我错过了什么吗?难道我不应该两次都收到编译错误吗?
这种行为在Java 8中似乎是新的,在两种情况下,我都得到了编译器错误。