1

私はこのインターフェースとクラスを持っています:

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

このリストがあると仮定します: List<A> aslistA 項目でいっぱいで、List<I> vari=null;
必要な型の変数がありますvari=aslistか? 最小限のコンバージョンでどうすればよいですか?

4

5 に答える 5

5

できません。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;
于 2012-05-20T16:32:20.947 に答える
4

いいえ、キャストしないでくださいList<A>。リストをList<I>最初から定義する必要があります。を実装Aしているため、このリストにのインスタンスを追加できます。AI

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

他のコードは、具体的な実装を知らなくても、このリストList<I>とその各要素を同じように扱うことができます。I

于 2012-05-20T16:32:56.517 に答える
4

リストのタイプを変更したくない場合は、浅いコピーを作成する必要があります。

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

また、使用することができますCollections.unmodifiableList

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

そうすれば、コピーは必要ありませんが、結果のリストは不変です(JBによって説明されている問題のある使用法を防ぐため)。

于 2012-05-20T16:33:26.710 に答える
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);
于 2012-05-20T16:35:27.230 に答える
2

あなたはこれを使うことができます:

java.util.Collections.copy(vari, asist);
于 2012-05-20T16:36:57.730 に答える