我有一个 Java 类,其中包含扩展 MyClass 的对象的子项。class MyClass {List<? extends MyClass> items;[...]出于某种原因,我无法将MyClass项目插入到此列表中。我不明白为什么,以及如何绕过这个问题。例如:void foo(){ items = new LinkedList<MyClass>(); // This is OK items.add(new MyClass()); // Not allowed... why?}编译器说“类型 List 中的方法 add(capture#1-of ? extends MyClass) 不适用于参数 (MyClass )”我真的不明白如何绕过这个问题,以及为什么编译器应该只接受必须扩展MyClass的类型。注意:为什么我需要使用这种方法?因为我需要允许 MyClass 的扩展具有子项列表。
3 回答
茅侃侃
TA贡献1842条经验 获得超21个赞
使用extends
你只能从集合中获取。你不能投入进去。您可以使用super
.
所以,在你的情况下,如果你使用 -List<? super MyClass> items;
你不会得到任何编译/运行时错误。
虽然 super 允许 get 和 put,但获取期间的返回类型是? super T
.
慕虎7371278
TA贡献1802条经验 获得超4个赞
List<? extends MyClass> items表示类型参数是可分配给的未知类型MyClass。
例如,它可能是一个List的MySubClass:
public MySubClass extends MyClass{}
List<? extends MyClass> items = new ArrayList<MySubClass>();
现在考虑你有MyAnotherSubClass从MyClass太延伸:
public MyAnotherSubClass extends MyClass{}
MyClass item = new MyAnotherSubClass(); // refer it using MyClass
显然,List<MySubClass> 不应允许包含MyAnotherSubClass:
items.add(item); // compile error
添加回答
举报
0/150
提交
取消