这个问题已经有一个答案在这里:

假设类 B 延伸类 A.我有一个 List<A> 我碰巧知道 包含实例 B.有没有办法我可以投的 List<A> 来一个 List<B>?

看来我的唯一选择是以循环的集合、铸造一个元素,创造一个新的集合。这似乎是一个完全浪费资源的指定类型的删除使得这完全没有必要在运行时间。

有帮助吗?

解决方案

你可以投通过的类型列出的界面:

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

其他提示

你可以试试这个:

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

它的依据是答案的jarnbjo,但是在不使用的原始名单。

List<A> 一个子类型的 List<B>!

在捷尔思甚至提到明确:

子类型并不延伸通过一般类型: T <: U 并不意味着 C<T> <: C<U>.

一种方法来保留某些类型的安全与最低性能的影响是使用 包装纸.这个例子是关于收集、列表的情况将是非常相似,也许有一天我会写这一点。如果别人来之前我,请让我们共同的代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top