读一本老书“用Java思考”:
static <T> void writeExact(List<T> list, T item) {
list.add(item);
}
static List<Apple> apples = new ArrayList<Apple>();
static List<Fruit> fruits = new ArrayList<Fruit>();
static void f1() {
writeExact(apples, new Apple());
// writeExact(fruits, new Apple()); // Error: <<
// Incompatible types: found Fruit, required Apple
}
当我使用Java 8运行同一程序时,它运行良好-传递fruits, new Apple()
时没有错误,即,现在也可以像您一样将Apple
放入List<Fruit>
中期望。
我想知道从什么版本开始这种行为已经改变。显然,这种新行为的确使我们使用了比通配符通用形式List<T>
更紧凑的通用形式List<? super T>
。
更重要的是,随着行为的改变,我们还能维持吗?
“超类型限制 relax 对您可以传递给 方法”