Java 将对象数组强制转换为整数数组错误

Java 将对象数组强制转换为整数数组错误,java,casting,Java,Casting,以下代码有什么问题 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 不能将对象数组强制转换为整数数组。必须循环遍历数组的所有元素,并单独强制转换每个元素 Object[] a = new

以下代码有什么问题

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


不能将
对象
数组强制转换为
整数
数组。必须循环遍历数组的所有元素,并单独强制转换每个元素

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];
}
Object[]a=新对象[1];
整数b=1;
a[0]=b;
整数[]c=新整数[a.length];
for(int i=0;i
编辑:我相信这个限制背后的基本原理是,在强制转换时,JVM希望确保运行时的类型安全。由于
对象
数组可以是除
整数
之外的任何东西,JVM无论如何都必须做上述代码正在做的事情(分别查看每个元素).语言设计师决定他们不希望JVM这样做(我不知道为什么,但我肯定这是一个很好的理由)

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

您试图将一个对象数组强制转换为整数数组。您不能这样做。不允许这种类型的向下转换

您可以创建一个整数数组,然后将第一个数组的每个值复制到第二个数组。

或执行以下操作:

...

  Integer[] integerArray = new Integer[integerList.size()];
  integerList.toArray(integerArray);

  return integerArray;

}

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

点击
ClassCastException
的原因是不能将
Integer
数组视为
对象的数组
Integer[]
对象[]
的子类型,但
对象[]
不是
整数[]

以下内容也不会给出
ClassCastException

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

在Java中执行强制转换时,Java编译器以及Java运行时会检查强制转换是否可行,如果不可行,则会抛出错误。

当涉及到对象类型的强制转换时,
instanceof
测试应该通过,以便完成分配。 在您的示例中,结果是

Object[]a=新对象[1];
布尔ISINTEGERRR=整数[]的实例

如果对上述行执行
sysout
,它将返回false;
因此,在施法之前尝试一个check实例会有所帮助。 因此,要修复错误,您可以添加'instanceof'检查

使用以下代码行:


(a)toArray(c);

请注意,如果对象数组包含除整数以外的任何条目,则上述代码将失败。

数组是协变的这一事实意味着JVM在执行赋值时必须检查类型安全性,但在它只读取一个元素时则不能。原因很简单。如果允许将对象[]强制转换为整数[],则JVM永远无法确定数组中对象的实际类型,因为旧引用将数组作为对象[]引用可能仍然存在。它必须每次对数组中对象的每次访问进行类型检查,因为它永远无法确定它是什么。如果类型检查失败,它将在与原因完全不同的地方引发异常。Integer[]等于int[]的integerArray?我想不是。需要进行取消装箱。仅当integerList是列表或ArrayList时有效。不适用于“经典”数组tho:(您还可以使用
Arrays.asList(objectArray).toArray(新整数[objectArray.length])
,但是,这与不必要的开销完全相同为什么
数组。copyOf
从不抛出ClassCastException?因为在这里我给出了整数[].class作为参数。我假设在内部,每个对象都将转换为整数并添加到整数数组中。通常,在处理泛型时会遇到这种情况,而这个答案是无用的。
Integer[] integerArray = Arrays.copyOf(a, a.length, Integer[].class);
Integer[] integerArray = Arrays.copyOfRange(a, 0, a.length, Integer[].class);
Object[] a = new Integer[1];
Integer b=1;
a[0]=b;
Integer[] c = (Integer[]) a;