繁体   English   中英

从Java中的匿名通用类调用重载方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM