2017-03-26 95 views
0

我试图创建DefaultListModel(类型String)的扩展版本,它接受我创建的类的对象,称为LogItem和'自动'使用该信息来推断应该使用哪些数据来填充相关元素。从Java中的匿名通用类调用重载方法

在我的代码,它看起来是这样的:

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){...})。

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

回答

2

您有几种选择:

你可以使用一个方法,让您的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)); 
+1

看起来像选项1是要走的路,因为你似乎无法改变'log'的声明类型 – rptmat57

+0

谢谢!我使用了第三个选项。我真的很想添加_one_重载的方法,并且您的解决方案能够工作!干杯! –

1

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

+0

那么为何我去修复这个?既然我不能改变声明的类型而不会导致其他一些问题,那么最好的方法是什么来实现它? –

2

你可以还覆盖toString()方法你LogItem类,或者实现转化的另一种方法,如果toString()被媒体链接使用:

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

,然后只用常规addElement(String)

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