Java 使用反射和泛型时发出警告
我如何重写这个:Java 使用反射和泛型时发出警告,java,generics,reflection,Java,Generics,Reflection,我如何重写这个: <T> T callMethod(String methodName, Object[] parameters) throws ... { ... return (T) SomeClass.class.getDeclaredMethod(methodName, parameterTypes).invoke(binding, parameters); } T callMethod(String methodName,Object[]参数)抛出。。。{
<T> T callMethod(String methodName, Object[] parameters) throws ... {
...
return (T) SomeClass.class.getDeclaredMethod(methodName, parameterTypes).invoke(binding, parameters);
}
T callMethod(String methodName,Object[]参数)抛出。。。{
...
return(T)SomeClass.class.getDeclaredMethod(methodName,parameterTypes).invoke(binding,parameters);
}
所以它不会产生警告
warning: [unchecked] unchecked cast
return (T) SomeClass.class.getDeclaredMethod(methodName, parameterTypes).invoke(binding, parameters);
required: T
found: Object
where T is a type-variable:
T extends Object declared in method <T>callMethod(String,Object[])
警告:[未选中]未选中强制转换
return(T)SomeClass.class.getDeclaredMethod(methodName,parameterTypes).invoke(binding,parameters);
必填项:T
发现:对象
其中T是一个类型变量:
T扩展方法callMethod中声明的对象(字符串,对象[])
我指的是无SuppressWarnings解决方案。您没有使用
@SuppressWarnings(“未选中”)
注释
@SuppressWarnings(“未选中”)
只能应用于对象的声明,这将起作用:编译器无法在编译时确定您在运行时选择的方法的返回类型为T。您只能在编译时抑制警告。我认为您必须接受@SuppressWarnings(…)
方法,因为它返回对象。请记住,泛型在运行时被擦除,反射在运行时发生
干杯,要做到这一点,您必须在方法参数中声明结果类型
public <T> T callMethod(Class<T> resultType, String methodName, Object[] parameters) {
Object result = SomeClass.class.getDeclaredMethod(methodName, parameterTypes).invoke(binding, parameters);
if(resultType.isInstance(result)) {
return resultType.cast(result);
}
throw new ClassCastException("Invalid result type");
}
public调用方法(类resultType,字符串methodName,对象[]参数){
对象结果=SomeClass.class.getDeclaredMethod(方法名,参数类型).invoke(绑定,参数);
if(resultType.isInstance(结果)){
返回resultType.cast(结果);
}
抛出新的ClassCastException(“无效结果类型”);
}
你为什么一定要这么做
见彼得L.答案 作为Peter Lawrey:
编译器无法在编译时确定
在运行时选择的方法的返回类型为T
我将更进一步地说,callMethod
根本不应该是通用方法。由于调用方通过将其名称作为字符串传递来决定调用哪个方法,因此该方法应该只返回对象
——就像调用
——并强制调用站点进行强制转换
不要使用@SuppressWarnings
-这里没有任何方法来证明这一点。你的意思是@SuppressWarnings
?;)或者,您可以在runtime.Yeap上传递所需类型的信息。这个更合适。我会删除isInstance
复选框<代码>Class.cast正在做这项工作。(实际上,在调用方法之前,我还要检查方法的返回类型是否静态正确。或者更可能的是,完全避免使用反射。)您不知道泛型参数是否正确。你真的不想做这种类型的演员。我完全同意,但是如果OP想要返回T
,除了使用或抑制演员警告之外,真的没有其他选择了。…。@AndersR.Bystrup,是的。你只需要自己提供这些信息。可能的重复我觉得有必要证明我为什么勾选了你的答案。这让我重新思考了我写的东西,删除了callMethod的一般特征,正如你提到的,在调用站点上使用强制转换。这样不仅警告消失了,而且我的代码更漂亮了,我学到了一些有用的东西。非常感谢。