2

継承に奇妙な問題があり、なぜそれが機能しないのかわかりません。

public interface A {  }

public interface B extends A {}


public class C {
void test() {
    ArrayList<A> foo = new ArrayList<B>();
    }
}

しかし、コンパイルすると次のエラーが発生します

Type mismatch: cannot convert from ArrayList<B> to ArrayList<A> C.java /bla/src/de/plai/test line 8 Java Problem

4

3 に答える 3

7

最初は直感に反しているように見えるかもしれませんが、クラスBがのサブクラスであってもA、 aはのサブクラスでList<B>はありませんList<A>。同様の投稿に対するこの以前の回答で、より詳細な説明と例を示しました。Effective Java 2nd Editionのそれぞれの項目へのリンクについては、この他の回答も参照してください。

この問題の解決策は、ワイルドカードを使用することです。したがって、リストを次のように宣言する必要があります

List<? extends A> foo = new ArrayList<B>();
于 2011-04-10T13:52:17.627 に答える
4
ArrayList<? extends A> foo = new ArrayList<B>();

リストの内容の一貫性を保証できなかったため、AのリストはBのリストと同じではありません。

つまり、可能であれば、B要素のみを含むようにインスタンス化されたリストにタイプAのアイテムを挿入できます。

もちろん、上記の宣言により、リストに要素を書き込むことができなくなります。これは読み取り専用の宣言です。

また、変数を実装ではなくインターフェースとして宣言することは、優れたOOP原則です。

List<? extends A> foo = new ArrayList<B>();
于 2011-04-10T13:53:33.577 に答える
1

同じことを投稿するためにちょうど上にありました:)それにもかかわらず..答えは同じですこれはあなたのために働くはずです。

ArrayList<? extends A> foo = new ArrayList<B>();
于 2011-04-10T14:00:54.400 に答える