我正在尝试创建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));