質問: new List super BBB>(); } } このとき、list1にはやをジェネリックスで指定したコレクションを代入することができ、list2にはやをジェネリックスで指定したコレクションを代入することができる認識です。 書籍には、 「list.add(new BBB()); →list1の場合、BBBのエレメントを格納することができないため、上記コードはコンパイルエラーが発生する」 との記述があるのですが、この内容が理解できませんでした。 list1の型パラメータは extends BBB>であり、上記認識の通り、を代入できるのではないかと考えております。 <追記> ご回答頂きありがとうございます。 疑問点を1点、追加させていただけないでしょうか。 list2の場合は 「list.add(new BBB());」 がコンパイルエラーにならない理由もご教授頂けないでしょうか。 もし型パラメータ extends BBB>のlist1にBBBを格納できないのであれば、 super BBB>のlist2も格納できないのではないでしょうか。 お手数ですがご指摘頂ければ幸いです。 どうぞよろしくお願いいたします。
回答: list1の実体のジェネリクス指定がCCCの場合、BBB型を入れられません。 このように、確実に入れられる保証がないため、コンパイルエラーになります。 逆に、list2のジェネリクス指定はBBBのサブクラス型で、その型がAAAであれ、Objectであれ、その型にBBB型を入れるのは問題ないため、コンパイルが通るのです。