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