我有一个很长的故事。
java泛型边界类型
反射的泛型类型声明
无论如何,我有一个方法,它使用反射调用一个方法并返回一个通用结果。
public static <V> JAXBElement<V> unmarshal(..., Class<V> valueType);
问题(?)是当我得到方法调用的结果时。我必须投它。
final Object result = method.invoke(...);
我发现我可以像这样将result
转换为JAXBElement<V>
。
@SuppressWarnings("unchecked")
final JAXBElement<V> result = (JAXBElement<V>) method.invoke(...);
return result;
有其他方法吗?我的意思是我有Class<V> valueType
可以使用。
如果不是,下面的语句是否有点cumbersome
?
// no warning, huh? :)
final JAXBElement<?> result = (JAXBElement<?>) method.invoke(...);
return new JAXBElement<V>(result.getName(), valueType, result.getScope(),
valueType.cast(result.getValue()));
谢谢。
不,method.invoke(...)
不是泛型方法,甚至整个Method
类都不是泛型方法。所以它返回Object
作为结果,您必须进行强制转换。
// no warning, huh? :)
final JAXBElement<?> result = ...
是-没有警告,但JAXBElement<?>
设置了一些限制,例如,您不能将值设置为此数据结构。你可以从那里得到Objects
,所以你可能需要在以后的代码中使用它。。。
您需要在方法中声明泛型类型V,如下所示:
public <V> JAXBElement<V> unmarshal(..., Class<V> valueType)
除此之外,我在你的代码中找不到任何错误。
一般来说,简短的答案是否定的。
然而,如果你仔细想想,你想实现什么?您已经说过要通过反射调用一段代码。泛型用于在编译时证明代码是正确的(因此在编译时会被擦除,通常在运行时不可用)。
若你们通过反射来调用方法,你们可以用任何类型来调用它,并在结果中得到任何类型。在编译时证明其正确性将是一项非常困难的任务。
也许您可以修改代码,使其不使用反射,从而避免强制转换。