同时采用反射和泛型警告(Warning while using reflection and gen

2019-07-17 18:38发布

如何重写这个:

<T> T callMethod(String methodName, Object[] parameters) throws ... {
    ...
    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[])

我的意思是无SupressWarnings解决方案。

Answer 1:

正如彼得Lawrey 指出 :

有没有办法编译器在编译时确定您在运行时选择的方法有返回类型T

我去了一步,说callMethod不应该在所有的通用方法。 由于主叫方决定什么方法是通过将它的名字作为一个字符串调用该方法应该只返回Object -像invoke -并强制调用站点投。

不要使用@SuppressWarnings -有没有办法在这里证明它。



Answer 2:

我认为你必须与住@SuppressWarnings(...)方法,因为该invoke()方法返回一个Object 。 请记住,泛型是在运行时被擦除,并反射发生在运行时...

干杯,



Answer 3:

有没有办法编译器在编译时确定您在运行时选择的方法有T的返回类型只能抑制在编译时警告。



Answer 4:

要做到这一点,你必须声明的方法参数的结果类型。

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");

}

为什么你一定要?

见彼得L.答案。



Answer 5:

你还没有使用@SuppressWarnings("unchecked")注解。

@SuppressWarnings("unchecked")只能应用到对象的声明,这将工作:



文章来源: Warning while using reflection and generics