2017-03-26 9 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

あなたは、いくつかのオプションがあります。

あなたのロジテムの文字列表現を取得し、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>拡張することができます:あなたは

MyDefaultListModel log = new MyDefaultListModel(); 
log.addElement(new LogItem(event)); 
+1

は、 'log'の宣言された型を変更できないように見えるので、オプション1のように見えます。 – rptmat57

+0

ありがとう!私は3番目のオプションを使用しました。私はちょうどその_one_オーバーロードされたメソッドを追加したいと思って、あなたのソリューションは動作します!乾杯! –

1

変数の宣言された型は、実行時の型ではなく、コンパイラが許可するものを決定します。変数logの宣言された型はDefaultListModel<String>であり、void addElement(LogItem)メソッドはありません。コンパイラは、宣言された型に知られていないメソッドへの呼び出しを許可できません。それはvoid addElement(String)しか見つけることができません。そして、あなたはLogItem引数でそれを呼び出すことはできません。

+0

それでは、どのように私は固定については行くかもしれないまた、あなたのtoString()方法は、クラスをロジテム、またはtoString()が出回っ使用されている場合、変換のための別の方法を実装してオーバーライドしますこの?宣言された型を他の多くの問題を引き起こすことなく変更することはできないので、これを動作させる最良の方法は何でしょうか? –

2

を可能性が使用し、その後

public class MyDefaultListModel extends DefaultListModel<String> { 
    public void addElement(LogItem logItem){ 
     super.addElement("[" + logItem.getTimestamp() + "] " + logItem.getEvent()); 
    } 
} 

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

そして普通のaddElement(String)を使用します:

log.addElement((new LogItem(event)).toString()); 
関連する問題