我有一些这样的代码:

Object doMethod(Method m, Object... args) throws Exception {
    Object obj = m.getDeclaringClass().getConstructor().newInstance();
    return m.invoke(obj, args);
}

我使用的代码有点复杂,但这就是它的想法。要调用 doMethod 我做这样的事情:
Method m = MyClass.class.getMethod("myMethod", String.class);
String result = (String)doMethod(m, "Hello");

这对我来说很好(可变数量的参数和所有)。 令我烦恼的是在调用者中对 String 进行必要的转换。 由于 myMethod 声明它返回一个 String ,我希望 doMethod 足够聪明以将其返回类型也更改为 String 。有没有办法使用 Java 泛型来完成这样的事情?
String result = doMethod(m, "Hello");
int result2 = doMethod(m2, "other", "args");

最佳答案

当然,

@SuppressWarnings("unchecked")
<T> T doMethod(Method m, Class<T> returnType, Object Args ...) {
    Object obj = m.getDeclaringClass().getConstructor().newInstance();
    return (T) m.invoke(obj, args);
}

String result = doMethod(m, m.getReturnType(), "Hello");

一个人对要求完成这样的事情的架构感到好奇,但这远远超出了范围:)

如果您不喜欢这样,您也可以取消 returnType 的绑定(bind),编译器会自动将其转换为您指定返回类型的任何内容。例如,这是合法的:
@SuppressWarnings("unchecked")
<T> T doMethod(Method m, Object Args ...) {
    Object obj = m.getDeclaringClass().getConstructor().newInstance();
    return (T) m.invoke(obj, args);
}

Actor 阵容将是您试图将其分配给的任何内容,但我认为大多数人会认为它是可疑的。

关于java - 结合 Java 泛型和反射来避免强制转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5914995/

10-12 12:46
查看更多