我正在尝试创建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){...}
)中创建的重载方法。
我想我必须遗漏一些东西,为什么我不能使用重载的类?
答案 0 :(得分:2)
您有几个选择:
您可以使用方法获取logItem的字符串表示形式并将其传递给DefaultListModel:
this.all_data.subscribe(users => {
var data = [];
users.forEach(user => {
if (user.$key !== this._auth$.id) {
console.log(user);
data.push(user);
}
});
this.users = data;
});
然后
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());
}
}
答案 1 :(得分:2)
您还可以覆盖LogItem类的toString()
方法,或者在已经使用toString()
的情况下实现另一种转换方法:
public String toString() {
return "[" + getTimestamp() + "] " + getEvent();
}
然后只使用常规addElement(String)
:
log.addElement( (new LogItem(event)).toString() );
答案 2 :(得分:1)
变量的声明类型决定了编译器允许的内容,而不是运行时类型。变量log
的声明类型为DefaultListModel<String>
,其中没有void addElement(LogItem)
方法。编译器不允许调用声明类型未知的方法。它只能找到void addElement(String)
。并且你不能用LogItem
参数调用它。