在没有警告的情况下强制转换泛型类型



我有一个很长的故事。

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)

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

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

然而,如果你仔细想想,你想实现什么?您已经说过要通过反射调用一段代码。泛型用于在编译时证明代码是正确的(因此在编译时会被擦除,通常在运行时不可用)。

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

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

相关内容

  • 没有找到相关文章

最新更新