在没有警告的情况下投射通用类

时间:2013-07-30 11:08:36

标签: java generics reflection jaxb

我有一个很长的故事。

java generics bounds type

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

感谢。

3 个答案:

答案 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,并且通常在运行时不可用)。

如果你通过反射调用方法,你可以用任何类型调用它,并获得结果中的任何类型。在编译时证明正确性是非常困难的任务。

也许你可以修改你不使用反射的代码,从而避免使用。