我有這樣的接口和類:轉換列表中其他類型的
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);
好了,你可以創建列表中的協變不變的觀點,雖然。 –