<T extends Number> void m1(List<T> list) {
list.add(list.get(0));
}
void m2(List<? extends Number> list) {
list.add(list.get(0));
}
我发现很难理解上述两种方法之间的区别
第一个方法m1()
成功编译,但方法m2()
产生编译器错误:
add(capture#1-of ? extends Number)
类型中的方法List<capture#1-of ? extends Number>
不适用于参数(capture#2-of ? extends Number)
答案 0 :(得分:2)
因为您无法在具有上限的类型列表中添加iten!你可以有一个List或List,其中一个不适合另一个进行修改操作!
List<? extends Number> list = new ArrayList<Integer>();
List<? extends Number> list = new ArrayList<Double>();
List<? extends Number> list = new ArrayList<Long>();
在这种情况下,变量列表可以在扩展Number的实例中具有任何类型。例如,您可以在方法中传递它。但在那里,你现在真的不是这种类型。你可以有一个ArrayList并说它添加一个新的Double。在编译时有意义,因为Double扩展了Number,但在运行时列表不能是这种类型并抛出异常。
请记住,当您使用上限<? extends T>
时, cant 修改列表,只需阅读即可!有Oracle tutorial(参见通配符章节内容 - 上限通配符,下限通配符等)