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

10-06 03:02