假设类B
扩展了类A
。我有List<A>
我碰巧知道只有包含B
的实例。有没有办法将List<A>
投射到List<B>
?
似乎我唯一的选择是遍历集合,一次投射一个元素,创建一个新集合。这似乎完全浪费了资源,因为类型擦除使得在运行时完全没有必要。
答案 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的情况非常相似,也许有一天我也会写。如果有人来找我,请让我们分享一下代码。