我了解到如果我有两个课程:
public class A {}
public class B extends A {}
Run Code Online (Sandbox Code Playgroud)
我可以从一个投List<A>
来List<B>
通过这样做:
List<B> list = (List<B>)(List<?>) collectionOfListA;
Run Code Online (Sandbox Code Playgroud)
这会产生警告,但它有效.但是,我读到这是不推荐的.在这种情况下是真的吗?
如果我知道它List<B>
会让我回归,为什么要进行这种演员是一种不好的做法?
请注意,我想知道为什么,在这种情况下,这是一个不好的做法,而不是为什么有警告.并且"这是一种不好的做法,因为它会产生警告"并不是一个好的答案.
直接转换列表是不好的,因为它破坏了 Java 类型系统。演员阵容总会成功,但程序可能会在稍后失败ClassCastException
当您去检索项目时,程序可能会失败,此时错误的来源可能不清楚。
一般来说,您希望程序失败时尽可能接近错误源。如果你强制转换列表,那么在有人真正尝试访问元素之前,它可能会传递一段时间,并且当它抛出 a 时,ClassCastException
可能真的很难将其追踪回该强制转换(至少很难-可能真的很难将其跟踪回该强制比 if节目在演员阵容中失败了)。
从您的评论来看,您似乎确定其中的所有内容listA
实际上都是B
我建议的情况:
List<B> listB = new ArrayList(listA.size());
for (A a : listA) {
if (a == null || a instanceof B) {
listB.add((B) a);
} else {
//Either ignore or throw exception
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
327 次 |
最近记录: |