将对象数组转换为整数数组错误

2022-08-31 13:00:13

以下代码有什么问题?

Object[] a = new Object[1];
Integer b=1;
a[0]=b;
Integer[] c = (Integer[]) a;

代码在最后一行有以下错误:

线程 “main” java.lang.ClassCastException 中的异常: [Ljava.lang.Object; 不能被强制转换为 [Ljava.lang.Integer;


答案 1

Ross,你也可以使用Arrays.copyof()或Arrays.copyOfRange()。

Integer[] integerArray = Arrays.copyOf(a, a.length, Integer[].class);
Integer[] integerArray = Arrays.copyOfRange(a, 0, a.length, Integer[].class);

这里打一个的原因是你不能把一个数组的数组当成一个数组。 是 的子类型,但不是 。ClassCastExceptionIntegerObjectInteger[]Object[]Object[]Integer[]

而下面的也不会给出.ClassCastException

Object[] a = new Integer[1];
Integer b=1;
a[0]=b;
Integer[] c = (Integer[]) a;

答案 2

不能将数组强制转换为数组。您必须遍历 a 的所有元素,并单独转换每个元素。ObjectInteger

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希望确保运行时的类型安全。由于数组可以是除此以外的任何东西,因此 JVM 必须执行上述代码正在执行的操作(单独查看每个元素)。语言设计师决定他们不希望JVM这样做(我不知道为什么,但我相信这是一个很好的理由)。ObjectsIntegers

但是,您可以将子类型数组转换为超类型数组(例如 到 )!Integer[]Object[]


推荐