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>,这意味着客户端无论如何都无法向其添加项目.