Java:将集合类型转换为子类型

Lan*_*uhn 35 java generics collections casting type-erasure

假设类B扩展了类A.我有一个List<A>我碰巧知道包含实例的B.有没有办法把它投到List<A>一个List<B>

似乎我唯一的选择是迭代集合,一次铸造一个元素,创建一个新的集合.这似乎完全浪费了资源,因为类型擦除使得在运行时完全没有必要.

jar*_*bjo 44

您可以通过无类型List接口进行强制转换:

List<A> a = new ArrayList<A>();
List<B> b = (List)a;
Run Code Online (Sandbox Code Playgroud)

  • 并且在此过程中松散所有类型的安全!如果`A`是`B`的基类,则列表可以包含`A`,而处理`b`的代码则希望它只返回`B`对象.这就是为什么首先不允许这种情况的原因. (4认同)
  • @Joachim,我认为这是原始问题的重点.这种方法相对于传统演员表的唯一缺点是,如果你错了,这个bug直到很久才会出现并且更难找到,而迭代会揭示你的错误. (2认同)
  • "我碰巧知道只包含B的实例".只要他只使用结果列表来检索元素而不是插入它们(例如,可能触发`checkedList`的运行时检查),他应该没问题. (2认同)

小智 16

你可以试试这个:

List<A> a = new ArrayList<A>();
List<B> b = (List<B>) (List<?>) a;
Run Code Online (Sandbox Code Playgroud)

它基于jarnbjo的答案,但不要使用原始列表.