为什么不推荐从List <A>到List <B>的转换?

Rob*_*rto 5 java casting list

了解到如果我有两个课程:

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>会让我回归,为什么要进行这种演员是一种不好的做法?

请注意,我想知道为什么,在这种情况下,这是一个不好的做法,而不是为什么有警告.并且"这是一种不好的做法,因为它会产生警告"并不是一个好的答案.

Bri*_*new 13

苹果是一种水果,但是一份苹果清单- 不是水果清单.

如果是的话,你可以把香蕉放在苹果列表中


HiJ*_*n89 3

直接转换列表是不好的,因为它破坏了 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)