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

Ros*_*oss 66 java casting

以下代码有什么问题?

Object[] a = new Object[1];
Integer b=1;
a[0]=b;
Integer[] c = (Integer[]) a;
Run Code Online (Sandbox Code Playgroud)

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

线程"main"中的异常java.lang.ClassCastException:[Ljava.lang.Object; 无法转换为[Ljava.lang.Integer;

nam*_*olk 90

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

Integer[] integerArray = Arrays.copyOf(a, a.length, Integer[].class);
Integer[] integerArray = Arrays.copyOfRange(a, 0, a.length, Integer[].class);
Run Code Online (Sandbox Code Playgroud)

这里击中的原因ClassCastException是你不能将数组Integer视为数组Object.Integer[]是一个子类型Object[]Object[]不是Integer[].

以下也不会给出一个ClassCastException.

Object[] a = new Integer[1];
Integer b=1;
a[0]=b;
Integer[] c = (Integer[]) a;
Run Code Online (Sandbox Code Playgroud)

  • 为什么 `Arrays.copyOf` 从不抛出 ClassCastException? (2认同)

Sea*_*ean 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];
}
Run Code Online (Sandbox Code Playgroud)

编辑:我相信这个限制背后的基本原理是,在进行转换时,JVM希望在运行时确保类型安全.由于数组Objects可以是任何其他内容Integers,因此JVM必须执行上述代码正在执行的操作(单独查看每个元素).语言设计者决定他们不希望JVM这样做(我不确定为什么,但我确定这是一个很好的理由).

但是,您可以施放亚型阵列到阵列父(例如Integer[]Object[])!

  • 数组是协变的这一事实意味着JVM在执行赋值时必须检查类型安全性 - 而不是在它只读取元素时. (3认同)
  • 原因很简单.如果允许将Object []强制转换为Integer [],则JVM永远无法确定数组中对象的实际类型,因为对数组的旧引用可能仍然存在.每次都必须对数组中对象的每次访问进行类型检查,因为它永远不会确定它是什么.如果类型检查失败,它会抛出一个与原因完全不同的异常. (3认同)

Mic*_*ael 14

或者执行以下操作:

...

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

  return integerArray;

}
Run Code Online (Sandbox Code Playgroud)


Tom*_*ffi 5

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
Run Code Online (Sandbox Code Playgroud)

您尝试将对象数组转换为整数数组。你不能这样做。这种类型的向下转型是不允许的。

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