【发布时间】:2019-02-01 14:03:36
【问题描述】:
我有一个 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 的扩展具有子项列表。
【问题讨论】:
-
为什么第一行是
Myclass而不是MyClass? -
如果您只想将 MyClass 的任何子项的实例添加到项目中,那么
? extends位并不是真正需要的:List将接受 MyClass 类型的任何实例或从 MyClass 继承的任何类... -
我认为符号
<? extends MyClass>被读作“扩展 MyClass 或 MyClass 本身的某个类” - 但该类型中没有足够的信息让编译器知道 which i> 您打算使用的 MyClass 的子类型...
标签: java generics inheritance extends