Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用反射和泛型时发出警告_Java_Generics_Reflection - Fatal编程技术网

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的一般特征,正如你提到的,在调用站点上使用强制转换。这样不仅警告消失了,而且我的代码更漂亮了,我学到了一些有用的东西。非常感谢。