2011-07-08 53 views
4

我有一個方法,它有一個輸入列表和每個輸入值,我必須將其轉換爲所需的類型。 (實際上這個列表的參數值是「some」形式的,我應該將其轉換爲所需的類型,所需的類型是所需的類型,這是通過反射的api調用)ClassCastException在投票列表<String>到類<?>

我已經編寫了類似這樣的:

Type[] argTypes = method.getGenericParameterTypes(); 
List<Object> acutalValues = // List of actual values from method input. 
// Resultant list of arguments which will holds casted values. 
List<Object> arguments = new ArrayList<Object>(argTypes.length); 

for (int i = 0; i < argTypes.length; i++) { 
Class<?> requiredClassTYpe = (Class<?>) argTypes[i]; // argTypes[1] =java.util.List<java.lang.String> fails.. 
// cast the actual value to the required type. Required type is requiredClassType 
arguments.add(castToRequiredType(requiredClassTYpe, actualValues.get(i))); 
} 

異常消息是這樣的:

ClassCastException: Cannot cast sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl (id=77) to java.lang.Class 

現在,如果我的第一行更改爲

Type[] argTypes = method.getParameterTypes() 

然後它通過任何想法爲什麼它可能會發生這樣的事情?

+0

那麼,argTypes [i]的類型是什麼? – jtahlborn

+0

@jtahlorn:// argTypes [1] = java.util.List 失敗。 –

+0

不,我的意思是什麼是實際價值的類型,這是失敗的演員? – jtahlborn

回答

0
Type[] argTypes = method.getParamterTypes() 

我相信你缺少你的方法調用一個「e」,應該是getParameterTypes()

8

因爲在method.getGenericParameterTypes() JavaDoc中陳述它:

返回Type對象代表組成的數組正規的 參數類型

...

如果形式參數類型是參數化類型 ,則返回的Type對象必須準確反映源代碼中使用的實際類型參數 。

因此,如果你的方法聲明如下:

public void myMethod(String string, List<String> list) { ... } 

argTypes[0]將包含Class實例(即Class<? extends String>),但argTypes[1]將包含java.lang.reflect.ParameterizedType實例。您可以使用getActualTypeArguments()方法獲取有關ParameterizedType實際類型參數的信息。例如,對於情況下,我如上所述:

Type[] listTypeArgs = ((ParameterizedType) argTypes[1]).getActualTypeArguments() 

// listTypeArgs.length == 1 as List<String> have one type argument 
// listTypeArgs[0] now contains instance of Class<? extends String> 
+0

那麼,我們有任何解決方法嗎? –

+0

請檢查我的更新答案。如果我更好地理解你想要達到的目標,我可以幫助你更多。你可以請張貼更多的代碼(最好有一些真實的使用例子)? – Idolon

1

由於您的方法參數是一個參數集合類型,getGenericParameterTypes返回一個ParameterizedType,而不是一個Type。要獲得實際類型,您需要首先檢查argTypes的每個元素是否爲ParameterizedType的實例,以及是否調用ParameterizedType.getActualTypeArguments()

話雖如此,我不知道你的代碼試圖做什麼。您的結果對象仍然是List<Object>,因此當您從列表中獲取元素時,您仍然必須將元素轉換爲正確的類型。在將元素存儲在列表中之前進行元素轉換並不能完成任何操作。

相關問題