【发布时间】:2016-09-19 21:21:55
【问题描述】:
设置
我有两个班级:
class A {
}
class B extends A {
}
还有B 类型的列表:
List<B> listOfB = new ArrayList<>();
第 1 部分:目标
我实际上想要实现的是将listOfB 的类型从B 转换为A。在Java tutorial 之后,我假设正确的方法是:
List<? extends A> listOfB = new ArrayList<>();
listOfB.add(new B()); // <--- Error here
List<A> listOfA = (List<A>) listOfB;
但是,这不允许我将 A 或 B 类的对象添加到 listOfB。我得到的错误是:
在列表中添加
(capture <? extends A>)不能应用于(B)
因此,我目前正在使用以下方法(效果很好):
List<A> listOfA = new ArrayList<A>(listOfB);
第 2 部分:效率
显然有一些不太好的方法 (link) 和 Java 教程中推荐的方法 (link)。
那么使用List<? extends A> 实现此目的的正确方法是什么?
我想知道上述方法的性能损失/收益。构造函数是否迭代认为listOfB 进行类型转换?如果是这样,随着列表变大,这是否会影响性能(与第 1 部分中的直接类型转换相比)?
【问题讨论】:
-
你可能想阅读PECS;它可能有助于解释发生了什么以及为什么。至于您的第 2 部分,构造函数将遍历
listOfB以将元素插入新的 ArrayList,但不涉及转换(也不需要,因为引用是已经类型 A) .构造函数只是复制引用。
标签: java list casting type-conversion