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

10-04 12:52