ジェネリクスとは
異なるデータ型に対して同じ処理を行うための仕組み。
→データ型ごとにメソッドを作る必要がなくなる
ワイルドカードとは
より柔軟に扱うための構文。
IntegerはNumberのサブクラスなので
Number num = Integer.valueOf(10);
↑はOK
List<Number> list = new ArrayList<Number>();
List<Integer> integerList = new ArrayList<Integer>();
list = integerList;
↑はNG
変数には親クラス型で宣言したものに、サブクラスのインスタンスを格納することができる。
ジェネリクスを使ったものについては、サブクラスのインスタンスを格納することはできない。
非境界ワイルドカード型
あらゆる型のオブジェクトを受け入れる型。
<?>
と記載する。
List<?> myList = new ArrayList<>();
List<Integer> list1 = new ArrayList<>();
List<String> list2 = new ArrayList<>();
myList = list1;
myList = list2;
上限境界ワイルドカード型
ある型をサブクラスのみを受け入れる型。
<? extends E>
と記載する。
List<? extends Number> myList = new ArrayList<>();
List<Integer> list1 = new ArrayList<>();
List<String> list2 = new ArrayList<>();
myList = list1;
myList = list2; // error
下限境界ワイルドカード型
ある型のスーパークラスのみを受け入れる型。
<? super E>
と記載する。
List<? super Number> myList = new ArrayList<>();
List<Object> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
myList = list1;
myList = list2; // error