2012-04-27 21 views
0

におけるジェネリック医薬品の2つのレベルを使用して、私はこの一般的なインタフェースがあります。私はこのような使用抽象クラス定義

public interface TjbListener<T> { 
    public void hearChange(T t); 
} 

をジェネリック型Uをパラメータとし、それ自体がUのメソッド(2)を呼び出すメソッド(1)を持っています。以下は、私の試みであるUを一般的なTjbListenerインタフェースを拡張する(または実装する)方法です。私はこの質問を書いていたように私は考え

public abstract class ListenerInformer<U extends TjbListener<"what should I write here">> { 
    List<U> mListeners = new ArrayList<U>(); 

    public void addListener(U u){ 
     mListeners.add(u); 
    } 

    public void informAll("what should I write here"){ 
     for(U u:mListeners){ 
      u.hearChange("what should I write here"); 
     } 
    } 
} 

一つの解決策は以下の通りですが、それは本当に解決策だ場合、私は知らない、またはそれは微妙な問題がある場合、私は理解していない:

public abstract class ListenerInformer<U extends TjbListener<T>,T> { 
    List<U> mListeners = new ArrayList<U>(); 

    public void addListener(U u){ 
     mListeners.add(u); 
    } 

    public void informAll(T t){ 
     for(U u:mListeners){ 
      u.hearChange(t); 
     } 
    } 
} 

UPDATE:同じクラスは異なるパラメータで同じインターフェイスを実装することはできませんので、私はちょうどこのアプローチは私の特定の場合にはほとんど役に立たないことを発見した

を注意してください。以下のリンク先の質問を参照してください。つまり、私の(またはJohannaの)ソリューションでは、異なるクラスターを使用せずに、1つのクラスを2つの異なるタイプのリスナーにすることはできません。

How to make a Java class that implements one interface with two generic types?

+0

解決するには?それは少し過剰に設計されたように見える... – aviad

+1

私はあなたの解決が大丈夫だと思う –

+0

私は秒、あなたのソリューションはいいですし、私は@aviadに同意、それ以上のengeeneredされていません。 – Snicolas

答えて

3

あなたの第二の例では動作するはずです。しかし、それが単純であれば、TjbListenerのサブクラスのすべてのインスタンスもTjbListenerのインスタンスであるため、Generic Uの必要はありません。

あなたはよりシンプル行うことができます:あなたのコードがないと扱いやすいですとして働く

public abstract class ListenerInformer<T> { 
    List<TjbListener<T>> mListeners = new ArrayList<TjbListener<T>>(); 

    public void addListener(TjbListener<T> u){ 
     mListeners.add(u); 
    } 

    public void informAll(T t){ 
     for(TjbListener<T> u:mListeners){ 
      u.hearChange(t); 
     } 
    } 
} 

。あなたはこの場合、

public U informAll2(T t){ 
    for(U u:mListeners){ 
     u.hearChange(t); 
     if (...) 
      return u; 
    } 
} 

を持っている場合は、一般的な2つのタイプのあなたの宣言が正しいたとえば、パラメータの戻り値としてTjbListenerのサブクラスの最終的な実装のタイプが必要な場合

二つの一般的なタイプが必要です(あなたがTを宣言する前に、Tに依存する汎用Uをpublic abstract class ListenerInformer<T, U extends TjbListener<T>>のように先に宣言しなければならないかどうかはわかりません)

+0

私の場合は汎用です。洞察を深めていただきありがとうございます。 – tjb

+0

おっと、申し訳ありませんが、以前は見たことのないソリューションには別の問題があります。addListenerへのパラメータ入力はタイプチェックされていません。 Tの値は、hearChangeの入力パラメータとしてTjbListenerインタフェースで既に指定されている必要がありますが、これは正しくありません。 – tjb

+0

はい、そうです。私はTjbListenerをパラメータ化するのを忘れていました。私は不足している「」を追加しました。今それは良いはずです。 – Johanna

関連する問題