3
List<? super MyClass> parentsOfMyclass
List<? extends MyClass> childsOfMyclassFirst
List<T extends MyClass> childsOfMyclassSecond

これらのコレクションに追加できる型を教えてください。MyClassこれらすべてのコレクションに のインスタンスを追加できますか?

4

3 に答える 3

3

List<? super MyClass>- のスーパークラスである何かが含まれています。これは、ここにスーパークラスMyClassのみを配置できることを意味しますMyClass

List<? extends MyClass>- を拡張するものが含まれています。つまり、ここには何も追加できません (どのサブクラスが正確にMyClass使用されているかわからないため)。確かに言うことができますが、そのアイテムは(またはサブクラス)です。MyClass

List<T extends MyClass>-Tのサブクラスである を含むMyClass。そのクラスを追加Tおよびサブクラス化することしかできません。

于 2013-07-30T11:07:30.197 に答える
0

実際には、最後のオプションをそのように使用することはできません。クラス宣言では使用できますが、変数宣言では使用できません。

static class MyClass {}

static class My2ndClass extends MyClass {}

static class ListExt<T extends MyClass> {}


public static void main(String[] args) {
    List<? super MyClass> parentsOfMyclass;
    List<? extends MyClass> childsOfMyclassFirst;
    List<T extends MyClass> childsOfMyclassSecond; //error

    ListExt<? extends MyClass> extList;


    childsOfMyclassFirst.add(new MyClass()); //error 
    parentsOfMyclass.add(new MyClass());
    extList.add(new MyClass()); // error
}
于 2013-07-30T11:22:53.350 に答える
-1

MyClass のインスタンスを追加できるのは、最初のケース (super を使用) のみです。? super MyClassリストをコンシューマーにします。つまり、タイプ MyClass のオブジェクトを受け取ることができます。2 番目のケースでは、リストは何も受け取ることができません。これはプロデューサーであり、読み取り専用リストです。3 番目のケースでは、前にダウンキャストを行うと、MyClass のサブタイプを追加できます.add((T)object);。もちろん、例外はスローされません。

3 番目のケースの正しい構文は、クラス宣言List<T> listT extends MyClassあるはずです。

于 2013-07-30T11:07:39.660 に答える