0

現在、ベースクラスとサブクラスの問題に直面しています。

パラメータとして単一のオブジェクト(メソッドsingle)を使用している間、コンパイラは文句を言いません。

しかし、リストに関しては、コンパイラーはリストを次のように宣言するように強制します<? extends Base>

その後、基本タイプのオブジェクトをそのリストに追加することはできなくなりました。

1つのリストで両方のタイプ(ベースとサブクラス)を使用するにはどうすればよいですか?

public class Generics {

    class Base {    }

    class Sub extends Base{     }

    interface I {
        public void list( List<Sub> list );
        public void single( Sub p);
    }

    class C implements I {
        public void list( List<Sub> list) {     }
        public void single( Sub p) {        }
    }

    void test() {
        C c = new C();
        c.single( new Sub() );
        c.list( new ArrayList<Base>() ); // The method list(List<Generics.Sub>) in the type Generics.C is not applicable for the arguments (ArrayList<Generics.Base>)

    }

    public static void main( String[] args) {
        Generics g = new Generics();
        g.test();
    }
}
4

3 に答える 3

1

以下はそれを行う2つの方法です....

public void inTake(List<? extends Base> list){

}

または

public T extends Base void inTake(List<T> list){

}
于 2012-09-24T16:24:41.063 に答える
1

すべてのリストを次のように宣言するだけです

List<Base> list;

Base次に、オブジェクトと任意のサブクラスのオブジェクトの両方を追加できます。

于 2012-09-24T16:01:23.823 に答える
1

変化する:

public void list(List<Sub> list);

に:

public void list(List<? extends Base> list);

justList<Base>を使用すると、次のようなコンパイラエラーが発生します。

public static void main(String[] args) {
    List<Sub> subs = new ArrayList<Sub>();
    doSomethingWith(subs); // The method doSomethingWith(List<Base>) in the type Main is not applicable for the arguments (List<Sub>)
}

private static void doSomethingWith(List<Base> bases) {
    // Do something with bases
}

渡すだけの場合、コンパイラエラーが発生しないList<Base>ためdoSomethingWith、この点は重要ではありません。特定のタイプ(上記など)のリストを渡す場合は、次のList<Sub>ように変更する必要がありますdoSomethingWith

private static void doSomethingWith(List<? extends Base> bases) {

これで問題が解決します。発信者レバーでそれを行うこともできます(ただし、少し面倒です):

    List<Sub> subs = new ArrayList<Sub>();
    doSomethingWith(new ArrayList<Base>(subs));

ワイルドカード(?)アプローチの問題の1つは、リストに新しいアイテムを追加できないことです。そのためには、次のようなものが必要です。

private static <B extends Base> void doSomethingWith(List<B> bases) {

B次に、インスタンスのみをに追加しますbases

于 2012-09-24T16:15:24.003 に答える