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

时间:2017-03-26 00:31:42

标签: java overloading anonymous-class

我正在尝试创建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){...})中创建的重载方法。

我想我必须遗漏一些东西,为什么我不能使用重载的类?

3 个答案:

答案 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参数调用它。