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

时间:2009-10-30 16:50:19

标签: java generics collections casting type-erasure

假设类B扩展了类A。我有List<A>我碰巧知道只有包含B的实例。有没有办法将List<A>投射到List<B>

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

4 个答案:

答案 0 :(得分:44)

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

List<A> a = new ArrayList<A>();
List<B> b = (List)a;

答案 1 :(得分:15)

你可以试试这个:

List<A> a = new ArrayList<A>();
List<B> b = (List<B>) (List<?>) a;

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

答案 2 :(得分:1)

List<A> 不是 List<B>的子类型!

The JLS even mentions that explicitly

  

子类型不会扩展到泛型类型:T <: U并不意味着C<T> <: C<U>

答案 3 :(得分:1)

保持某种类型安全且对性能影响最小的方法是使用wrapper。这个例子是关于Collection的,List的情况非常相似,也许有一天我也会写。如果有人来找我,请让我们分享一下代码。