2012-05-20 57 views
1

我有这样的接口和类:转换列表中其他类型的

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

假设我有这样的名单:List<A> aslist充满项目,我有型List<I> vari=null;
的变量,我需要TI做vari=aslist ?我怎样才能做到最低兑换?

回答

5

你不能。 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; 
+0

好了,你可以创建列表中的协变不变的观点,虽然。 –

4

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

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

其他代码可以把这个列表作为List<I>和它的每一个元素为I不知道具体的实现。

+0

我从休眠结果中获得List ,因此无法使用列表。 – Naor

4

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

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

您还可以使用Collections.unmodifiableList

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

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

+0

以上不编译(至少在Java 6下)。它需要更改为'集合。 unmodifiableList(aslist)'。 +1,但。我从来没有注意到你可以用'unmodifiableList()'来做到这一点。 –

+0

@JB:感谢您的纠正,我不经常编写Java代码:) –

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); 
2

您可以使用此:

java.util.Collections.copy(vari, asist); 
相关问题