2017-03-26 103 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());