我正在阅读“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());
}
那些指示错误的注释行在 6 和 7 Java 中都不会产生任何错误。这对我来说似乎很奇怪,因为writeExact
方法只接受确切类型的参数。那么它为什么起作用呢?既然它有效,那么超类型通配符的目的是什么?
编辑
所以我明白了,想再澄清一件事:谁是使用通配符进行类型推断的老大?返回类型,第一个参数,第二个参数,...。我的意思是如果 SomeClass.< Fruit >method(...) 没有指定