3

我该如何重写这个:

<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[])

我的意思是 no-SupressWarnings 解决方案。

4

5 回答 5

5

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

干杯,

于 2013-01-02T10:40:41.703 回答
3

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

于 2013-01-02T10:40:28.397 回答
3

正如彼得劳里指出的那样

编译器无法在编译时确定您在运行时选择的方法的返回类型为T.

我会更进一步,说这callMethod根本不应该是一个通用方法。由于调用者通过将其名称作为字符串传递来决定调用什么方法,因此该方法应该只是返回Object- 就像invoke- 并强制调用站点进行强制转换。

不要使用@SuppressWarnings- 这里没有办法证明它是合理的。

于 2013-01-02T11:01:22.830 回答
2

为此,您必须在方法参数中声明结果类型。

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

}

为什么一定要?

请参阅 Peter L. 的答案。

于 2013-01-02T10:45:37.140 回答
0

您还没有使用@SuppressWarnings("unchecked")注释。

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

于 2013-01-02T10:39:07.323 回答