0

私はこの汎用インターフェースを持っています:

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

私はこのように使用します:

public interface ObjectOneListener extends TjbListener<ClassOne> {

}

ジェネリック型 U をパラメーターとして取り、それ自体が U のメソッド (2) を呼び出すメソッド (1) を持つ抽象ジェネリック クラス A を書きたいと思います。ジェネリック 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");
        }
    }
}

この質問を書いているときに考えた解決策の 1 つを以下に示しますが、それが本当に解決策であるかどうか、または理解できない微妙な問題があるかどうかはわかりません。

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);
        }
    }
}

更新:注意してください

同じクラスが異なるパラメーターで同じインターフェイスを実装できないため、このアプローチは私の特定のケースではほとんど役に立たないことがわかりました。以下にリンクされている質問を参照してください。これは、構成のような別の戦略を使用せずに、1 つのクラスを私の (または Johanna の) ソリューションで 2 つの異なるタイプのリスナーにすることはできないことを意味します。

2 つのジェネリック型を持つ 1 つのインターフェイスを実装する Java クラスを作成するには?

4

1 に答える 1

3

2番目の例はうまくいくはずです。しかし、TjbListener のサブクラスのすべてのインスタンスも TjbListener のインスタンスであるため、それがそれほど単純である場合、汎用 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);
        }
    }
}

これはコードと同じように機能し、扱いが簡単です。

パラメータの戻り値として TjbListener のサブクラスの最終的な実装型が必要な場合は、2 つのジェネリック型が必要です。

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

この場合、2 つのジェネリック型を使用した宣言は正しいです (T を宣言する前に、T に依存するジェネリック U を宣言できるかどうかはわかりませんpublic abstract class ListenerInformer<T, U extends TjbListener<T>>) 。

于 2012-04-27T07:30:39.110 に答える