[英]Calling an overloaded method from an anonymous, generic class in Java
我正在尝试创建DefaultListModel
的扩展版本(类型String
),该扩展版本接受我创建的类的对象(称为LogItem
并“自动”使用该信息来推断应使用哪些数据来填充相关数据元件。
在我的代码中,它看起来像这样:
public static DefaultListModel<String> log = new DefaultListModel<String>(){
public void addElement(LogItem logItem){
super.addElement("[" + logItem.getTimestamp() + "] " + logItem.getEvent());
}
};
然后在课堂上:
log.addElement(new LogItem(event));
但是,这两部分代码中的后一部分给出了编译时错误:
Error:(196, 32) java: incompatible types: com.example.LogItem cannot be converted to java.lang.String
这样看来,由于某种原因,我似乎无法访问在匿名类( addElement(LogItem logitem){...}
)中创建的重载方法。
我想我一定会缺少一些东西,为什么不能使用重载的类?
您有几种选择:
您可以使用一种方法来获取logItem的字符串表示形式,并将其传递给DefaultListModel:
private String getLogItemAsString(LogItem logItem) {
return "[" + logItem.getTimestamp() + "] " + logItem.getEvent();
}
然后
log.addElement(getLogItemAsString(new LogItem(event)));
也许更好的方法是通过实用程序类:
public final class DefaultListModelUtils {
private DefaultListModelUtils() {}
public static final void addElement(DefaultListModel<String> defaultListModel, LogItem logItem) {
defaultListModel.addElement(getLogItemAsString(logItem));
}
private static String getLogItemAsString(LogItem logItem) {
return "[" + logItem.getTimestamp() + "] " + logItem.getEvent();
}
}
并像这样使用它:
DefaultListModelUtils.addElement(log, new LogItem(event));
或者,您可以像这样扩展DefaultListModel<String>
:
public class MyDefaultListModel extends DefaultListModel<String> {
public void addElement(LogItem logItem){
super.addElement("[" + logItem.getTimestamp() + "] " + logItem.getEvent());
}
}
然后使用
MyDefaultListModel log = new MyDefaultListModel();
log.addElement(new LogItem(event));
您也可以重写LogItem类的toString()
方法,或者如果已经使用toString()
,则可以实现另一个转换方法:
public String toString() {
return "[" + getTimestamp() + "] " + getEvent();
}
然后只需使用常规的addElement(String)
:
log.addElement( (new LogItem(event)).toString() );
变量的声明类型确定编译器允许的内容,而不是运行时类型。 变量log
的声明类型为DefaultListModel<String>
,它没有void addElement(LogItem)
方法。 编译器不允许调用声明类型未知的方法。 它只能找到void addElement(String)
。 而且您不能使用LogItem
参数来调用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.