我有这个界面和类:
interface I {
void method1();
}
class A implements I {
void method1(){
....
}
}
假设我有这个列表:List<A> aslist
填充了A项,我有一个List<I> vari=null;
类型的变量
我需要做vari=aslist
吗?如何以最低转换率完成?
答案 0 :(得分:5)
你做不到。 List<Car>
不是List<Vehicle>
。如果是,您可以执行以下操作:
List<Car> cars = new ArrayList<Car>();
List<Vehicle> vehicles = (List<Vehicle>) cars;
cars.add(new Bicycle());
因此它将彻底打破集合的类型安全性。
您可以做的是:
List<? extends Vehicle> vehicles = cars;
答案 1 :(得分:4)
不,你不应该施放List<A>
。
您应该从一开始就将列表定义为List<I>
。然后,您可以将A
的实例添加到此列表中,因为A
实现了I
:
List<I> list = new ArrayList<I>();
list.add(new A());
其他代码可以将此列表视为List<I>
,并将其每个元素视为I
,而不知道具体实现。
答案 2 :(得分:4)
如果您不愿意更改列表类型,则必须创建浅色副本:
List<I> vari = new ArrayList<I>(aslist);
您还可以使用Collections.unmodifiableList
:
List<I> vari = Collections.<I>unmodifiableList(aslist);
这样,您不需要副本,但结果列表是不可变的(以防止JB描述的有问题的用法)。
答案 3 :(得分:2)
// If you don't care about some compiler warnings and know about the possible side effects that might arise if you continue to use "aslist" then:
List<A> aslist = ....;
List<I> vari = (List<I>)((List)aslist);
//Otherwise every single element must be copied. Is a one-liner though:
List<A> aslist = ....;
List<I> vari = new ArrayList(aslist);
答案 4 :(得分:2)
您可以使用:
java.util.Collections.copy(vari, asist);