1

我有这个接口和类:

interface I {
    void method1();
}
class A implements I  {
    void method1(){
    ....
    }
}

假设我有这个列表:List<A> aslist填充了 A 项,并且我有一个类型的变量,List<I> vari=null;
我需要做vari=aslist什么?我怎样才能用最少的转换来做到这一点?

4

5 回答 5

5

你不能。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;
于 2012-05-20T16:32:20.947 回答
4

不,你不应该施放List<A>. 您应该List<I>从头开始定义列表。然后,您可以将 的实例添加A到此列表中,因为A实现I

List<I> list = new ArrayList<I>();
list.add(new A());

其他代码可以在不知道具体实现的情况下将此列表视为List<I>及其每个元素。I

于 2012-05-20T16:32:56.517 回答
4

如果您不愿意更改列表的类型,则必须创建一个浅拷贝:

List<I> vari = new ArrayList<I>(aslist);

您还可以使用Collections.unmodifiableList

List<I> vari = Collections.<I>unmodifiableList(aslist);

这样,您不需要副本,但结果列表是不可变的(以防止 JB 描述的有问题的用法)。

于 2012-05-20T16:33:26.710 回答
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);
于 2012-05-20T16:35:27.230 回答
2

你可以使用这个:

java.util.Collections.copy(vari, asist);
于 2012-05-20T16:36:57.730 回答