我有通用类类型,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,解释了为什么我需要这个
答案 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