为什么将Type []强制转换为Class []会抛出ClassCastException?

时间:2010-09-09 09:48:14

标签: java reflection casting

今天我正在编写一些反思使用的代码,我遇到了这种行为我无法解释:为什么会这样做

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

当迭代同一个数组并转换每个元素时抛出一个ClassCastException,即

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

成功?

我的意思是,如果可以将单个元素转换为另一个类,为什么不能在相同类型的数组之间进行转换呢?

可能有一个原因,但我似乎无法找到一个......

3 个答案:

答案 0 :(得分:5)

您无法将Type[]转换为Class[],因为Type[]不是Class[]。这可能听起来微不足道,但这就是它的全部内容。

如果您可以将Type[]投射到Class[],当其中一个元素是Type不是Class时,您会发生什么?例如ParameterizedType)?

答案 1 :(得分:1)

请注意,要投射到Class[],对象实际上必须是Class[],而不是Type[]。例如,这将失败:

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

但这会奏效:

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

答案 2 :(得分:0)

您无法转换整个数组,因为无法保证数组中的所有元素都是Class类型。如果其中一个是Type的其他实现呢?

怎么办?