将列表转换为其他类型

时间:2012-05-20 16:28:11

标签: java

我有这个界面和类:

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

假设我有这个列表:List<A> aslist填充了A项,我有一个List<I> vari=null;类型的变量
我需要做vari=aslist吗?如何以最低转换率完成?

5 个答案:

答案 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);