通过List <?>从List <subclass>上传到List <superclass>

Max*_*x S 14 java generics collections wildcard

我有一个A类,一个B类延伸A.

在另一个类CI中有一个字段

private List<B> listB;
Run Code Online (Sandbox Code Playgroud)

现在,由于一些不寻常的原因,我必须在C中实现此方法

public List<A> getList();
Run Code Online (Sandbox Code Playgroud)

我试图通过强制将ListB字段的upcast <A>通过List 强制转换为List 来实现<?>:

public List<A> getList(){
    return (List<A>)(List<?>)listB;
}
Run Code Online (Sandbox Code Playgroud)

客户应该这样做

List<A> list = getList();
for(A a:list){
    //do something with a
}
Run Code Online (Sandbox Code Playgroud)

我做了一些测试,似乎工作正常,但老实说,我不确定所有可能的影响.

这个解决方案是否正确 它是最好的解决方案吗?

谢谢你的回答.

Jon*_*eet 16

不,这不安全.客户应该这样做

List<A> list = getList();
Run Code Online (Sandbox Code Playgroud)

因为否则他们可以写

list.add(new C()); // Where C extends A
Run Code Online (Sandbox Code Playgroud)

然后,List<B>当它尝试使用它时,知道列表作为a的原始代码会有问题,假设每个元素都兼容B.

您可以将原始列表包装为有效 - 或者getList返回a List<? extends A>,这意味着客户端无论如何都无法向其添加项目.