Java通配符捕获

时间:2016-11-09 12:16:00

标签: java

<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)

1 个答案:

答案 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(参见通配符章节内容 - 上限通配符下限通配符等)