【发布时间】:2011-03-23 15:52:43
【问题描述】:
有谁知道为什么下面的代码不能编译? add() 和 addAll() 都不能按预期工作。删除“?扩展”部分使一切正常,但是我将无法添加 Foo 的子类。
List<? extends Foo> list1 = new ArrayList<Foo>();
List<? extends Foo> list2 = new ArrayList<Foo>();
/* Won't compile */
list2.add( new Foo() ); //error 1
list1.addAll(list2); //error 2
错误 1:
IntelliJ 说:
add(capture<? extends Foo>) in List cannot be applied to add(Foo)
编译器说:
cannot find symbol
symbol : method addAll(java.util.List<capture#692 of ? extends Foo>)
location: interface java.util.List<capture#128 of ? extends Foo>
错误2:
IntelliJ 给了我
addAll(java.util.Collection<? extends capture<? extends Foo>>) in List cannot be applied to addAll(java.util.List<capture<? extends Foo>>)
而编译器只是说
cannot find symbol
symbol : method addAll(java.util.List<capture#692 of ? extends Foo>)
location: interface java.util.List<capture#128 of ? extends Foo>
list1.addAll(list2);
【问题讨论】:
-
请解释你为什么使用,而只是 Foo。在解释这一点时,也许事情会变得清楚。
-
嘿,英戈。很好的观点,并且可能更早地创造了更好/更准确的答案。我对使用通配符接受子类型的方法参数感到困惑,并认为我需要使用 符号以便能够将子类型添加到集合中。 Myers 和 Paulo(下)帮助了解了为什么没有必要(或正确)。很好的评论 - 谢谢!
标签: java generics generic-list generic-collections