我是Java的新手(实际花了三天),但我必须编写一个自定义的跨平台编辑器应用程序作为我的数据库的接口。实际上一切都运行顺利,但我有一个奇怪的包错误。 inb4 3年的Python和AS3编程。
我正在尝试扩展 java.util.ArrayList 并加入 add 方法覆盖。代码看起来像这样:
package myxmleditor;
public class BarsList<EditorXMLObject> extends
java.util.ArrayList<EditorXMLObject> {
@Override
public boolean add(EditorXMLObject element) {
editorGUI.addEditorPane(element); // error here
return super.add(element);
}
public EditorGUIInterface editorGUI = null;
}
BarsList , EditorGUIInterface 和 EditorXMLObject 位于 myxmleditor 包中。 addEditorPane方法是
EditorGUIInterface.addEditorPane(EditorXMLObject element)
NetBeans向我显示错误:
method addEditorPane in class myxmleditor.TsukasaXMLEditGUI cannot be applied to given types;
required: **myxmleditor.EditorXMLObject**
found: **EditorXMLObject**
reason: actual argument EditorXMLObject cannot be converted to myxmleditor.EditorXMLObject by method invocation conversion
答案 0 :(得分:7)
您的班级BarsList不是模板。如果你想使BarsList成为EditorXMLObject的列表,那么简单写一下:
public class BarsList extends java.util.ArrayList<EditorXMLObject>
但是,如果您想基于ArrayList创建另一个模板,请写:
public class BarsList<T> extends java.util.ArrayList<T>
答案 1 :(得分:5)
最好不要将ArrayList子类化。尝试将ArrayList保留为BarsList的成员,然后自己调用add。
使用继承可能会使以后更改列表实现变得更加困难(调用代码可能会使用ArrayList特定的行为)。此外,您依赖于ArrayList的实现细节(正如hertzsprung指出的那样),并且负责维护ArrayList所做的任何合同。当用户调用remove,addAll或clear?
时会发生什么或者,类中的内容很少,直接使用List并手动调用addEditorPane可能最简单。这取决于您调用添加的频率和位置。
答案 2 :(得分:2)
子类化集合是危险的,因为,例如,您不知道addAll()是否在超类中委托add()(这在Effective Java中进一步解释,第71页)。
如果可以避免,最好创建一个转发集合; Google Guava的ForwardingList在这里很有用。