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あるはずです。