今天我正在编写一些反思使用的代码,我遇到了这种行为我无法解释:为什么会这样做
Type[] types = ((ParameterizedType)m.getGenericReturnType()).getActualTypeArguments();
Class[] c = (Class[])types;
当迭代同一个数组并转换每个元素时抛出一个ClassCastException,即
for(Type t : types) {
Class c = (Class)t;
}
成功?
我的意思是,如果可以将单个元素转换为另一个类,为什么不能在相同类型的数组之间进行转换呢?
可能有一个原因,但我似乎无法找到一个......
答案 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
的其他实现呢?