List<? super MyClass> parentsOfMyclass
List<? extends MyClass> childsOfMyclassFirst
List<T extends MyClass> childsOfMyclassSecond
これらのコレクションに追加できる型を教えてください。MyClass
これらすべてのコレクションに のインスタンスを追加できますか?
List<? super MyClass> parentsOfMyclass
List<? extends MyClass> childsOfMyclassFirst
List<T extends MyClass> childsOfMyclassSecond
これらのコレクションに追加できる型を教えてください。MyClass
これらすべてのコレクションに のインスタンスを追加できますか?
List<? super MyClass>
- のスーパークラスである何かが含まれています。これは、ここにスーパークラスMyClass
のみを配置できることを意味しますMyClass
。
List<? extends MyClass>
- を拡張するものが含まれています。つまり、ここには何も追加できません (どのサブクラスが正確にMyClass
使用されているかわからないため)。確かに言うことができますが、そのアイテムは(またはサブクラス)です。MyClass
List<T extends MyClass>
-T
のサブクラスである を含むMyClass
。そのクラスを追加T
およびサブクラス化することしかできません。
実際には、最後のオプションをそのように使用することはできません。クラス宣言では使用できますが、変数宣言では使用できません。
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
}
MyClass のインスタンスを追加できるのは、最初のケース (super を使用) のみです。? super MyClass
リストをコンシューマーにします。つまり、タイプ MyClass のオブジェクトを受け取ることができます。2 番目のケースでは、リストは何も受け取ることができません。これはプロデューサーであり、読み取り専用リストです。3 番目のケースでは、前にダウンキャストを行うと、MyClass のサブタイプを追加できます.add((T)object);
。もちろん、例外はスローされません。
3 番目のケースの正しい構文は、クラス宣言List<T> list
にT extends MyClass
あるはずです。