将Object数组转换为Integer数组错误

时间:2009-07-12 03:14:18

标签: 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;

5 个答案:

答案 0 :(得分:88)

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;

答案 1 :(得分:21)

您无法将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[])!

答案 2 :(得分:14)

或者执行以下操作:

...

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

  return integerArray;

}

答案 3 :(得分:4)

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;

您尝试将一个Object数组转换为强制转换为Array of Integer。你不能这样做。不允许这种类型的向下倾斜。

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

答案 4 :(得分:1)

当在Java中完成转换时,Java编译器以及Java运行时检查是否可以进行转换,如果不是则抛出错误。

当涉及对象类型的转换时,instanceof测试应该通过以便分配完成。 在您的示例中,结果为 Object[] a = new Object[1]; boolean isIntegerArr = a instanceof Integer[]
如果你执行上述行的sysout,它将返回false;
所以在施法前尝试检查实例会有所帮助。 因此,要修正错误,您可以添加&#39; instanceof&#39;校验
OR
使用以下代码行:
(Arrays.asList(a)).toArray(c);

请注意,如果Object数组包含除Integer之外的任何条目,则上述代码将失败。