2013-07-30 119 views
4

我有一个很长的故事。无法警告投射泛型类型?

java generics bounds type

generics type declaration for reflection

无论如何,我有它调用使用反射的方法和返回通用结果的方法。

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

问题(?)是当我得到方法调用的结果。我必须投它。

final Object result = method.invoke(...); 

我发现我可以投的resultJAXBElement<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())); 

谢谢。

回答

2

不,method.invoke(...)不是一般的方法,甚至整个Method类不是通用的。所以它返回Object作为结果,你必须施放。

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

是没有警告,但JAXBElement<?>提出一些限制,比如你不能把值这个数据结构。你可以从那里得到Objects,所以你可能需要稍后在你的代码中能够得到它...

1

您需要声明泛型类型V在你的方法是这样的:

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

其他,我无法找到代码中的任何错误。

+0

Woops!更新。谢谢。 –

1

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

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

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

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