Java通用接口

时间:2012-10-26 12:45:46

标签: java class interface

我有通用类类型,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;


        }
}

但它不起作用

修改:我发布了新的question,解释了为什么我需要这个

3 个答案:

答案 0 :(得分:1)

是的,你必须写:

class MyClass< T extends TheInterface >

使用此信息,编译器知道T具有名为callMe

的操作

答案 1 :(得分:0)

我不确定,您在寻找Strategy模式吗?

答案 2 :(得分: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