Javaにおける、ワイルドカードを使用したジェネリックスの指定についての質問です。
ある書籍で書かれていた内容が理解できなかったため、質問させていただきます。
以下のようなコードがあります。
import java.util.*;
class AAA {}
class BBB extends AAA {}
class CCC extends BBB {}
public class Main {
public static void main(String[] args) {
List<? extends BBB> list1 = new List<? extends BBB>();
List<? super BBB> list2 = new List<? super BBB>();
}
}
このとき、list1には<BBB>や<CCC>をジェネリックスで指定したコレクションを代入することができ、list2には<BBB>や<AAA>をジェネリックスで指定したコレクションを代入することができる認識です。
書籍には、
「list.add(new BBB());
→list1の場合、BBBのエレメントを格納することができないため、上記コードはコンパイルエラーが発生する」
との記述があるのですが、この内容が理解できませんでした。
list1の型パラメータは<? extends BBB>であり、上記認識の通り、<BBB>を代入できるのではないかと考えております。
<追記>
ご回答頂きありがとうございます。
疑問点を1点、追加させていただけないでしょうか。
list2の場合は
「list.add(new BBB());」
がコンパイルエラーにならない理由もご教授頂けないでしょうか。
もし型パラメータ<? extends BBB>のlist1にBBBを格納できないのであれば、<? super BBB>のlist2も格納できないのではないでしょうか。
お手数ですがご指摘頂ければ幸いです。
どうぞよろしくお願いいたします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/03/17 06:36 編集
2017/03/17 06:44
退会済みユーザー
2017/03/17 07:08