从 Java 中的匿名泛型 class 调用重载方法

Calling an overloaded method from an anonymous, generic class in Java

我正在尝试创建 DefaultListModelString 类型)的扩展版本,它接受我创建的 class 对象,称为 LogItem 和 'automatically' 使用该信息来推断应该使用哪些数据来填充相关元素。

在我的代码中它看起来像这样:

public static DefaultListModel<String> log = new DefaultListModel<String>(){

    public void addElement(LogItem logItem){

        super.addElement("[" + logItem.getTimestamp() + "] " + logItem.getEvent());

    }

};

及之后的 class:

log.addElement(new LogItem(event));

然而这两段代码的后一段给出了编译时错误:

Error:(196, 32) java: incompatible types: com.example.LogItem cannot be converted to java.lang.String

因此,由于某种原因,我似乎无法访问我在匿名 class (addElement(LogItem logitem){...}) 中创建的重载方法。

我想我一定是遗漏了什么,为什么我不能使用重载的class?

变量的声明类型决定了编译器允许的类型,而不是运行时类型。您的变量 log 的声明类型是 DefaultListModel<String>,它没有 void addElement(LogItem) 方法。编译器不允许调用声明类型未知的方法。它只能找到void addElement(String)。你不能用 LogItem 参数来调用它。

您有几个选择:

您可以使用一种方法来获取 logItem 的字符串表示形式并将其传递给您的 DefaultListModel:

private String getLogItemAsString(LogItem logItem) {
    return "[" + logItem.getTimestamp() + "] " + logItem.getEvent();
}

然后

log.addElement(getLogItemAsString(new LogItem(event)));



也许更好的方法是通过 Utility Class:

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 class 的 toString() 方法,或者如果 toString() 已被使用,则实施另一种转换方法:

public String toString() {
    return "[" + getTimestamp() + "] " + getEvent();
}

然后使用常规 addElement(String):

log.addElement( (new LogItem(event)).toString() );