0

10分前に同様の質問をしましたが、間違ったコードスニペットを貼り付けました。本当にごめんなさい。

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

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

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

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

エラーメッセージ:「Generics.C型のメソッドlist(List <Generics.Base>)は、引数(List <Generics.Sub>)には適用されません。」

public class Generics {

    class Base {    }

    class Sub extends Base{     }

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

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

    void test() {
        C c = new C();
        c.single( new Sub() );
        List<Sub> b = new ArrayList<Sub>(); 
        c.list( b );                    // error message as above
    }

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

list-methods引数を型として宣言する以外の方法はあります <? extends Base>か?

4

1 に答える 1

3

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

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

}

または

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

}
于 2012-09-24T16:30:28.097 に答える