java - 通过 List<?> 从 List<subclass> 向上转换为 List<superclass>

标签 java generics collections wildcard

我有一个类 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/

相关文章:

c# - 单元测试——我做的对吗?

php - 如何为通用的、可插入的集合设计过滤器?

java - Yui Compressor 文件在 Jar 打包之前未刷新

Java 2D 游戏编程-SpriteSheet 动画

java - 内部 lambda 引用 外部 lambda 变量

Java泛型子反向引用父级/选择子类属性

java - 在泛型类型 "T"的对象和泛型类型 "<T extends Comparable<T>>"的对象之间进行转换

generics - 在泛型 Dart 上调用方法

java - 将 int 数组转换为集合

java - 模式版本可以与 jar 文件不同吗?