以下代码有什么问题?
Object[] a = new Object[1];
Integer b=1;
a[0]=b;
Integer[] c = (Integer[]) a;
代码在最后一行出现以下错误:
异常 in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; 无法转换为 [Ljava.lang.Integer;
Ross,你也可以使用Arrays.copyof()或Arrays.copyOfRange()
Integer[] integerArray = Arrays.copyOf(a, a.length, Integer[].class);
Integer[] integerArray = Arrays.copyOfRange(a, 0, a.length, Integer[].class);
在这里,导致出现 ClassCastException
的原因是您不能将一个 Integer
数组视为 Object
数组。 Integer[]
是 Object[]
的子类型,但 Object[]
不是 Integer[]
。
而且以下内容也不会引发 ClassCastException
。
Object[] a = new Integer[1];
Integer b=1;
a[0]=b;
Integer[] c = (Integer[]) a;
你无法将一个Object
数组强制转换为一个Integer
数组。 你需要循环遍历a的所有元素并逐个进行类型转换。
Object[] a = new Object[1];
Integer b=1;
a[0]=b;
Integer[] c = new Integer[a.length];
for(int i = 0; i < a.length; i++)
{
c[i] = (Integer) a[i];
}
编辑:我相信这个限制背后的原因是在进行类型转换时,JVM希望确保运行时的类型安全性。由于一个Objects
数组除了Integers
之外还可以是任何东西,所以JVM无论如何都必须像上面的代码一样(逐个查看每个元素)。语言设计者决定他们不想让JVM这样做(我不确定为什么,但我相信有很好的理由)。
然而,你可以将子类型数组强制转换为超类型数组(例如,Integer[]
转换成Object[]
)!
或者执行以下操作:
...
Integer[] integerArray = new Integer[integerList.size()];
integerList.toArray(integerArray);
return integerArray;
}
Arrays.asList(objectArray).toArray(new Integer[objectArray.length])
,但这与 namalfernandolk 的回答 完全相同,只是多了不必要的开销。 - xerufjava.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
您试图将一个对象数组转换为整数数组。这是不允许的向下转型。
您可以创建一个整数数组,然后将第一个数组的每个值复制到第二个数组中。
instanceof
测试才能进行赋值。在您的示例中,结果是
Object[] a = new Object[1];
boolean isIntegerArr = a instanceof Integer[]
Object[] a = new Object[1];
boolean isIntegerArr = a instanceof Integer[]
sysout
命令,它将返回false;
(Arrays.asList(a)).toArray(c);
Arrays.copyOf
永远不会抛出 ClassCastException 异常? - Kvass