The Get and Put Principle

Java Generics and Collections』本の項目2.4のまとめ。


ワイルドカード使用に関する原則:


まずGenericsで以下は、互換性のない型というエラーが発生する。

List<Integer> ints = new LinkedList<Integer>();
List<Number> nums = ints;  // compile-time error

この場合、Integer is Numberなので、以下のようにワイルドカードextendsを使用すればOK。

List<Integer> ints = new LinkedList<Integer>();
List<? extends Number> nums = ints;

IntegerとNumberの関係が逆の場合、以下のようにsuperを使用する。

List<Number> nums = new LinkedList<Number>();
List<? super Integer> ints = nums;

getする場合は以下。

List<Integer> ints = new LinkedList<Integer>();
List<? extends Number> nums = ints;
nums.add(1);  // compile-time error
nums.get(0);  // ok
Integer i = nums.get(0);  // compile-time error
Number  n = nums.get(0);  // ok

putする場合は以下。

List<Number> nums = new LinkedList<Number>();
List<? super Integer> ints = nums;
ints.add(1);    // ok
ints.add(2.3);  // compile-time error
ints.get(0);  // ok
Integer i = ints.get(0);  // compile-time error
Number  n = ints.get(0);  // compile-time error

両方したい場合は以下のようにするしかない。

List<Integer> nums = new LinkedList<Integer>();
List<Integer> ints = nums;
ints.add(1);  // ok
Integer i = ints.get(0);  // ok