我有一个很长的故事。
generics type declaration for reflection
无论如何,我有一个方法,它使用反射调用方法并返回一般结果。
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()));
感谢。
答案 0 :(得分:2)
不,method.invoke(...)
不是通用方法,即使整个Method
类都不是通用的。所以它返回Object
作为结果,你必须施放。
// no warning, huh? :)
final JAXBElement<?> result = ...
是没有警告,但JAXBElement<?>
有一些限制,例如您无法为此数据结构添加值。你可以从那里得到Objects
,所以你可能需要稍后在你的代码中获取它...
答案 1 :(得分:1)
您需要在方法中声明泛型类型V,如下所示:
public <V> JAXBElement<V> unmarshal(..., Class<V> valueType)
除此之外,我在代码中找不到任何错误。
答案 2 :(得分:1)
总的来说,简短的回答是否定的。
但是如果你想到它,你想达到什么目的?您已经说过要通过反射调用一段代码。泛型用于证明您的代码在编译时是正确的(因此在编译时是erased,并且通常在运行时不可用)。
如果你通过反射调用方法,你可以用任何类型调用它,并获得结果中的任何类型。在编译时证明正确性是非常困难的任务。
也许你可以修改你不使用反射的代码,从而避免使用。