【问题标题】:Java Wildcard capture [duplicate]Java通配符捕获[重复]
【发布时间】:2016-11-09 12:16:00
【问题描述】:
<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()产生编译错误:

List&lt;capture#1-of ? extends Number&gt; 类型中的方法add(capture#1-of ? extends Number) 不适用于参数(capture#2-of ? extends Number)

【问题讨论】:

  • TypeErasure....

标签: java


【解决方案1】:

因为您不能在具有上限的类型列表中添加项!您可以有一个列表或列表,其中一个不适合另一个进行修改操作!

List<? extends Number> list = new ArrayList<Integer>();
List<? extends Number> list = new ArrayList<Double>();
List<? extends Number> list = new ArrayList<Long>();

在这种情况下,变量列表可以具有扩展Number 的实例中的任何类型。例如,您可以在您的方法中传递它。但是在那里,你真的不知道可能是哪种类型。你可以有一个ArrayList&lt;Integer&gt; 并告诉它添加一个新的Double。在编译时是有意义的,因为Double 扩展了Number,但在运行时列表不可能是这种类型并抛出异常。

请记住,当您使用上限&lt;? extends T&gt; 时,您不能修改列表,只需阅读它!有Oracle tutorial(参见通配符章节内容-上界通配符下界通配符等)

【讨论】:

  • “在编译时有意义”,但是为什么方法m2是编译错误,而不是运行时错误?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-25
相关资源
最近更新 更多