我有这个接口和类:
interface I {
void method1();
}
class A implements I {
void method1(){
....
}
}
假设我有这个列表:List<A> aslist
填充了 A 项,并且我有一个类型的变量,List<I> vari=null;
我需要做vari=aslist
什么?我怎样才能用最少的转换来做到这一点?
我有这个接口和类:
interface I {
void method1();
}
class A implements I {
void method1(){
....
}
}
假设我有这个列表:List<A> aslist
填充了 A 项,并且我有一个类型的变量,List<I> vari=null;
我需要做vari=aslist
什么?我怎样才能用最少的转换来做到这一点?
你不能。AList<Car>
不是List<Vehicle>
. 如果是,您可以执行以下操作:
List<Car> cars = new ArrayList<Car>();
List<Vehicle> vehicles = (List<Vehicle>) cars;
cars.add(new Bicycle());
因此它将完全破坏集合的类型安全性。
您可以执行以下操作:
List<? extends Vehicle> vehicles = cars;
不,你不应该施放List<A>
. 您应该List<I>
从头开始定义列表。然后,您可以将 的实例添加A
到此列表中,因为A
实现I
:
List<I> list = new ArrayList<I>();
list.add(new A());
其他代码可以在不知道具体实现的情况下将此列表视为List<I>
及其每个元素。I
如果您不愿意更改列表的类型,则必须创建一个浅拷贝:
List<I> vari = new ArrayList<I>(aslist);
您还可以使用Collections.unmodifiableList
:
List<I> vari = Collections.<I>unmodifiableList(aslist);
这样,您不需要副本,但结果列表是不可变的(以防止 JB 描述的有问题的用法)。
// 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);
你可以使用这个:
java.util.Collections.copy(vari, asist);