我有一个类 A 和一个类 B 扩展了 A
在另一个C类中我有一个字段
private List<B> listB;
现在,由于一些不寻常的原因,我必须在 C 中实现这个方法
public List<A> getList();
我试图通过强制将 listB 字段向上转换为列表 <A>
来做到这一点通过列表 <?>
Actor :
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>
,这意味着客户无论如何都无法向其中添加项目。
如果您使用的列表实现是不可修改的,那么它实际上不会导致问题 - 但我个人仍然会尽可能避免它。
关于java - 通过 List<?> 从 List<subclass> 向上转换为 List<superclass>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3194977/