1

次のように、ジェネリッククラスタイプ T があります。

class MyClass<T>

また、T は内部に 1 つのメソッドしかないインターフェイスであることはわかっていますが、どのインターフェイスかはわかりません。これを書くことはできません。

class MyClass< T extends TheInterface >

このメソッドを呼び出す方法はありますか?

public void callMe(T me, Object...params){
    // How can I invoke T interface method?
}

私はこれを試しています:

public void callMe(T me, Object... params) {
// methods.length is 244, just as in my activity class
        Method[] methods = me.getClass().getMethods(); 
        try {
            methods[0].invoke(me, params);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
            return;
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            return;
        } catch (InvocationTargetException e) {
            e.printStackTrace();
            return;


        }
}

しかし、それは機能していません

編集:なぜこれが必要なのかを説明する新しい質問を投稿しました

4

3 に答える 3

1

はい、あなたは書く必要があります:

class MyClass< T extends TheInterface >

この情報を使用して、コンパイラは T に次の名前の操作があることを認識します。callMe

于 2012-10-26T12:48:15.027 に答える
0

MyClass 内の宣言を変更できない場合は、型キャストするだけです。

    public void callMe(T me, Object... params) {
        Someinterface instance = (Someinterface) me;
        list.callMe(me, params);
    }

ただし、以下のように宣言することが最善の解決策であるはずです

class MyClass<T extends Someinterface >

以下は、それを使用してそれを行う方法の簡単なデモンストレーションですreflection

 class MyClass<T> {
    public void callMe(T me, Object... params) throws SecurityException,
            NoSuchMethodException {
        // How can I invoke T interface method?
        Method size = me.getClass().getMethod("size", null);
        Method add = me.getClass().getMethod("add", Object.class);

        try {
            add.invoke(me, 10);
            System.out.println(size.invoke(me, params));

        } catch (IllegalArgumentException e) {
            e.printStackTrace();
            return;
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            return;
        } catch (InvocationTargetException e) {
            e.printStackTrace();
            return;

        }
    }
}


    MyClass<List> myclass = new MyClass<List>();
    myclass.callMe(new ArrayList(), null);

出力:

  1 
于 2012-10-26T13:05:57.727 に答える
0

Strategyよくわかりませんが、パターンをお探しですか?

于 2012-10-26T12:55:13.910 に答える