2012-05-20 61 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); 
相關問題