6

私はインターフェースAを持っています:

interface A {
}

それから私はクラスBを持っています:

class B implements A {
}

次に、Aのリストを使用するメソッドがあります。

void process(ArrayList<A> myList) {
}

私はそれにBのリストを渡したいです:

ArrayList<B> items = new ArrayList<B>();
items.add(new B());
process(items);

しかし、タイプが一致しないというエラーがあります。理由はわかります。ArrayListは型自体であり、からに変換する機能はありませArrayList<B>ArrayList<A>。私のprocessメソッドに渡すのに適した新しい配列を形成するための迅速でリソースの面で軽い方法はありますか?

4

2 に答える 2

10

最も簡単な解決策は、方法の1つを次のように変更することだと思います。

void process(ArrayList<? extends A> myList) {
}

ただし、このソリューションでは、リスト全体が同じタイプである必要があることに注意してください。つまり、Cも実装するクラスがある場合A、配列内のアイテムを混在させて、その一部がタイプBになり、一部がタイプになるようにすることはできませんC

また、以下のコメントで指摘されているように、このメソッド内からリストにオブジェクトを追加することはできません。

于 2012-09-18T20:35:17.450 に答える
4

もう1つの方法は、A代わりにのArrayListを作成することです。B

ArrayList<A> items = new ArrayList<A>();
items.add(new B());
process(items);

宣言されたリストにインターフェースを実装するクラス(Bなど)を追加することは完全に許容されます。

余談Listですが、リストをインスタンス化するときにArrayListのみを使用します。サイモンの答えも含めて、これは

void process(List<? extends A> myList) {
}

List<A> items = new ArrayList<A>();
items.add(new B());
process(items);
于 2012-09-18T20:42:19.570 に答える