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

3
今天我在编写一些重型反射代码时,遇到了一个无法解释的行为:为什么会发生这种情况?
Type[] types = ((ParameterizedType)m.getGenericReturnType()).getActualTypeArguments();
Class[] c = (Class[])types;

当在迭代同一数组并将每个元素强制转换时,抛出ClassCastException,即:
for(Type t : types) {
    Class c = (Class)t;
}

成功了吗?

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

可能有原因,但我似乎找不到...


2
也许这可以帮助你:https://dev59.com/BHRC5IYBdhLWcg3wJNqf - theomega
3个回答

5
您不能将Type[]强制转换为Class[],因为Type[]不是Class[]。听起来可能很琐碎,但事实就是这样。
如果您可以将Type[]强制转换为Class[],那么当其中一个元素是不是ClassType(例如ParameterizedType)时,您会期望发生什么呢?

我理解了,但是难道不应该只有在一个元素不是 Class 时才抛出 ClassCastException,而不是每次都抛出吗? - Raibaz
不行,因为实际运行时类型不是 Class[],就像一个由 new Object() 创建的 Object 实例不能神奇地变成 String 一样。请参见下面的答案。 - thecoop

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的其他实现,会怎样呢?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接