私はこのインターフェースとクラスを持っています:
interface I {
void method1();
}
class A implements I {
void method1(){
....
}
}
このリストがあると仮定します: List<A> aslist
A 項目でいっぱいで、List<I> vari=null;
必要な型の変数がありますvari=aslist
か? 最小限のコンバージョンでどうすればよいですか?
私はこのインターフェースとクラスを持っています:
interface I {
void method1();
}
class A implements I {
void method1(){
....
}
}
このリストがあると仮定します: List<A> aslist
A 項目でいっぱいで、List<I> vari=null;
必要な型の変数がありますvari=aslist
か? 最小限のコンバージョンでどうすればよいですか?
できません。AList<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<I> vari = new ArrayList<I>(aslist);
また、使用することができますCollections.unmodifiableList
:
List<I> vari = Collections.<I>unmodifiableList(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);