以下代码有什么问题?
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;
答案 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)
instanceof
测试应该通过以便分配完成。
在您的示例中,结果为
Object[] a = new Object[1];
boolean isIntegerArr = a instanceof Integer[]
sysout
,它将返回false;
(Arrays.asList(a)).toArray(c);