我有这样的接口和类:转换列表中其他类型的
interface I {
void method1();
}
class A implements I {
void method1(){
....
}
}
假设我有这样的名单:List<A> aslist
充满项目,我有型List<I> vari=null;
的变量,我需要TI做vari=aslist
?我怎样才能做到最低兑换?
我有这样的接口和类:转换列表中其他类型的
interface I {
void method1();
}
class A implements I {
void method1(){
....
}
}
假设我有这样的名单:List<A> aslist
充满项目,我有型List<I> vari=null;
的变量,我需要TI做vari=aslist
?我怎样才能做到最低兑换?
你不能。 A 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;
不,你不应该投List<A>
。 你应该从头开始定义列表为List<I>
。然后,您可以添加的A
实例此列表中,因为A
实现I
:
List<I> list = new ArrayList<I>();
list.add(new A());
其他代码可以把这个列表作为List<I>
和它的每一个元素为I
不知道具体的实现。
我从休眠结果中获得List ,因此无法使用列表。 – Naor
如果您不愿意更改列表的类型,你必须创建一个浅表副本:
List<I> vari = new ArrayList<I>(aslist);
您还可以使用Collections.unmodifiableList
:
List<I> vari = Collections.<I>unmodifiableList(aslist);
这样,你不不需要副本,但结果列表是不可变的(以防止JB描述的有问题的用法)。
以上不编译(至少在Java 6下)。它需要更改为'集合。 unmodifiableList(aslist)'。 +1,但。我从来没有注意到你可以用'unmodifiableList()'来做到这一点。 –
@JB:感谢您的纠正,我不经常编写Java代码:) –
// 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);
好了,你可以创建列表中的协变不变的观点,虽然。 –