Java Generics and Collectionsからの関連する抜粋を次に示します。
2.4. ゲットアンドプットの原則
可能な限りワイルドカードを挿入することをお勧めしますが、使用するワイルドカードをどのように決定するのでしょうか? どこで を使用する必要がextends
あり、どこで を使用する必要がsuper
あり、ワイルドカードを使用することがまったく不適切な場所はどこですか?
幸いなことに、単純な原則によってどちらが適切かが決まります。
Get and Put の原則:
extends
構造体から値を取得する場合のみワイルドカードを使用し、super
値を構造体に入れるだけの場合はワイルドカードを使用し、get と put の両方を行う場合はワイルドカードを使用しないでください。
この原則が copy メソッドの署名で機能していることは既に確認しました。
public static <T> void copy(List<? super T> dest, List<? extends T> src)
メソッドはソース src から値を取得するため、ワイルドカードを使用して宣言さextends
れ、値を宛先 dst に入れるため、super
ワイルドカードを使用して宣言されます。イテレータを使用するときは常に構造体から値を取得するため、extends
ワイルドカードを使用してください。数値のコレクションを取得し、それぞれを double に変換して合計するメソッドを次に示します。
public static double sum(Collection<? extends Number> nums) {
double s = 0.0;
for (Number num : nums) s += num.doubleValue();
return s;
}