我有A类,B类扩展了A
在另一个C类中,我有一个字段
private List<B> listB;
现在,由于某些不寻常的原因,我必须在C中实现此方法
public List<A> getList();
我试图通过强制通过list
<A>
强制将listB字段转换为List <?>
来做到这一点:public List<A> getList(){
return (List<A>)(List<?>)listB;
}
客户应该做的
List<A> list = getList();
for(A a:list){
//do something with a
}
我做了一些测试,看来工作正常,但是老实说,我不确定所有可能的影响。
这个解决方案正确吗?这是最好的解决方案吗?
感谢您的回答。
最佳答案
不,这不安全。客户不应该做
List<A> list = getList();
因为否则他们会写
list.add(new C()); // Where C extends A
然后,假定每个元素都与
List<B>
兼容,则将列表作为B
知道的原始代码将在尝试使用它时遇到问题。您可以将原始列表包装成有效的只读列表,也可以使
getList
返回List<? extends A>
,这意味着客户端无论如何都无法向其添加项目。