1

我有通用类类型, T 如下:

class MyClass<T>

我也知道 T 是接口,里面只有一个方法,但我不知道是什么接口,我不能这样写:

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 回答