Java 将列表转换为其他类型

Java 将列表转换为其他类型,java,Java,我有这个接口和类: interface I { void method1(); } class A implements I { void method1(){ .... } } 假设我有这个列表:list aslist填充了一个项目,并且我有一个类型为list vari=null的变量; 我需要ti do vari=aslist?我怎么能用最小的兑换率呢?你不能。列表不是列表。如果是,您可以执行以下操作: List<Car> cars = new

我有这个接口和类:

interface I {
    void method1();
}
class A implements I  {
    void method1(){
    ....
    }
}
假设我有这个列表:list aslist填充了一个项目,并且我有一个类型为list vari=null的变量; 我需要ti do vari=aslist?我怎么能用最小的兑换率呢?

你不能。列表不是列表。如果是,您可以执行以下操作:

List<Car> cars = new ArrayList<Car>();
List<Vehicle> vehicles = (List<Vehicle>) cars;
cars.add(new Bicycle());
List<? extends Vehicle> vehicles = cars;
因此,它将完全破坏集合的类型安全性

您可以执行以下操作:

List<Car> cars = new ArrayList<Car>();
List<Vehicle> vehicles = (List<Vehicle>) cars;
cars.add(new Bicycle());
List<? extends Vehicle> vehicles = cars;
你不能。列表不是列表。如果是,您可以执行以下操作:

List<Car> cars = new ArrayList<Car>();
List<Vehicle> vehicles = (List<Vehicle>) cars;
cars.add(new Bicycle());
List<? extends Vehicle> vehicles = cars;
因此,它将完全破坏集合的类型安全性

您可以执行以下操作:

List<Car> cars = new ArrayList<Car>();
List<Vehicle> vehicles = (List<Vehicle>) cars;
cars.add(new Bicycle());
List<? extends Vehicle> vehicles = cars;
不,你不应该投名单。 您只需要从一开始就将列表定义为list。然后,您可以将的实例添加到此列表中,因为A实现了I:

其他代码可以将此列表视为列表,并将其每个元素视为I,而不知道具体实现

不,您不应该强制转换列表。 您只需要从一开始就将列表定义为list。然后,您可以将的实例添加到此列表中,因为A实现了I:


其他代码可以将此列表视为列表,并将其每个元素视为I,而不知道具体实现

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

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

这样,您就不需要副本,但生成的列表是不可变的,以防止JB所描述的有问题的使用。

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

List<I> vari = new ArrayList<I>(aslist);
// 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);
这样,您就不需要副本,但生成的列表是不可变的,以防止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);
您可以使用以下选项:

java.util.Collections.copy(vari, asist);

不过,您可以在列表上创建一个协变不可变视图。不过,您可以在列表上创建一个协变不可变视图。至少在Java 6下,上面的内容不会编译。需要将其更改为Collections.unmodifiableListaslist+1,尽管如此。我从来没有注意到你可以用unmodifiableList来做这件事。@JB:谢谢你的更正,我不经常编写Java代码:至少在Java 6下,上面的代码不会编译。需要将其更改为Collections.unmodifiableListaslist+1,尽管如此。我从来没有注意到你可以用不可修改的列表来做这些。@JB:谢谢你的更正,我不经常编写Java代码:我从hibernate结果中获取列表,因此无法使用列表。我从hibernate结果中获取列表,因此无法使用列表。