5

我有一个很长的故事。

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

谢谢。

4

3 回答 3

2

不,method.invoke(...)不是通用方法,甚至整个Method类都不是通用的。所以它Object作为结果返回,你必须强制转换。

// no warning, huh? :)
final JAXBElement<?> result = ...

是的,没有警告,但JAXBElement<?>有一些限制,例如,您不能将值放入此数据结构。你可以Objects从那里得到,所以你可能需要稍后在你的代码中添加它......

于 2013-07-30T11:20:47.633 回答
1

您需要在您的方法中声明泛型类型 V,如下所示:

public <V> JAXBElement<V> unmarshal(..., Class<V> valueType)

除此之外,我在您的代码中找不到任何错误。

于 2013-07-30T11:20:19.743 回答
1

一般来说,简短的回答是否定的。

但是,如果您想到它,您想实现什么?你说过你想通过反射调用一段代码。泛型用于证明您的代码在编译时是正确的(因此在编译时被擦除,并且通常在运行时不可用)。

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

也许您可以修改不使用反射的代码,从而避免强制转换。

于 2013-07-30T11:26:45.830 回答