2010-09-09 55 views
3

今天,我在寫一些沉重的使用反射的代碼,我碰到這種行爲我無法解釋:爲什麼爲什麼將類型[]轉換爲類[]拋出ClassCastException?

Type[] types = ((ParameterizedType)m.getGenericReturnType()).getActualTypeArguments(); 
Class[] c = (Class[])types; 

拋出ClassCastException,迭代當在同一陣列和鑄造每一個元素,即

for(Type t : types) { 
    Class c = (Class)t; 
} 

是否成功?

我的意思是,如果可以將單個元素轉換爲另一個類,爲什麼不能在相同類型的數組之間進行轉換呢?

有可能是一個原因,但我似乎無法找到一個...

+2

也許這有助於:http://stackoverflow.com/q/395030/61855 – theomega 2010-09-09 09:51:26

回答

5

你不能投了Type[]Class[]因爲Type[]不是Class[]。這可能聽起來微不足道,但這就是它的全部。

如果你能投出Type[]Class[],你會期望發生時,其要素之一是Type這不是一個Class(A例如ParameterizedType)?

+0

我明白了,但是不應該拋出ClassCastException只有當其中一個元素不是一個類而不是拋出每次? – Raibaz 2010-09-09 10:31:22

+0

不,因爲實際的運行時類型不是'Class []',就像'Object'的一個實例(用'new Object()'創建的)不能奇蹟般地變成一個'String'。請參閱下面的答案 – thecoop 2010-09-09 17:36:17

1

請記住,要投射到Class[],該物體必須實際上是Class[]而不是Type[]。作爲一個例子,這將失敗:

Object[] objArr = new Object[10]; 
Integer[] intArr = (Integer[])objArr; // fail. 

,但是這將工作:

Object[] objArr = new Integer[10]; 
Integer[] intArr = (Integer[])objArr; 
0

你不能投全陣列,因爲沒有保證該陣列中的所有元素的類型的Class。如果其中一個是Type的其他實現呢?

相關問題