2013-07-30 122 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,通常在運行時不可用)。

如果你通過反射調用方法,你可以從字面上用任何類型調用它,並得到任何類型的結果。在編譯時證明正確性將是非常困難的任務。

也許你可以修改你的代碼,它不使用反射,從而避免投射。