「Thinking in Java 4th edition」のジェネリックの章を読んでいますが、例があります。
class Fruit{}
class Apple extends Fruit {}
...
static <T> void writeExact(List<T> list, T item) {
list.add(item);
}
static List<Apple> apples = new ArrayList<>();
static List<Fruit> fruit = new ArrayList<>();
static void f1() {
writeExact(apples, new Apple());
// writeExact(fruit, new Apple()); // Error:
// Incompatible types: found Fruit, required Apple
}
static <T> void writeWithWildcard(List<? super T> list, T item) {
list.add(item);
}
static void f2() {
writeWithWildcard(apples, new Apple());
writeWithWildcard(fruit, new Apple());
}
エラーが示されているこれらのコメント行は、Java 6 と 7 の両方でまったくエラーを生成しません。writeExact
メソッドは正確なタイプのパラメーターのみを受け入れるため、私には奇妙に思えます。では、なぜ機能するのでしょうか。スーパータイプのワイルドカードの目的は何ですか?
編集
もう1つ明確にしたいのは、ワイルドカードを使用した型推論のボスは誰ですか? 戻り値の型、最初のパラメーター、2 番目のパラメーター、... . つまり、 SomeClass.< Fruit >method(...) が指定されていない場合