以下代码有什么问题?
Object[] a = new Object[1];
Integer b=1;
a[0]=b;
Integer[] c = (Integer[]) a;
该代码在最后一行有以下错误:
线程“主”中的异常java.lang.ClassCastException:[Ljava.lang.Object; 无法转换为[Ljava.lang.Integer;
Answers:
罗斯,您也可以使用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;
您不能将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[]
)!
或执行以下操作:
...
Integer[] integerArray = new Integer[integerList.size()];
integerList.toArray(integerArray);
return integerArray;
}
Arrays.asList(objectArray).toArray(new Integer[objectArray.length])
,但是这样做与namalfernandolk的答案完全相同,而没有必要的开销
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
您尝试将对象数组转换为整数数组。你做不到。不允许这种类型的垂头丧气。
您可以创建一个Integer数组,然后将第一个数组的每个值复制到第二个数组中。
instanceof
应通过测试以使分配通过。在您的示例中,结果为
Object[] a = new Object[1];
boolean isIntegerArr = a instanceof Integer[]
sysout
上述行的a,它将返回false;否则,结果为false。
(Arrays.asList(a)).toArray(c);
Arrays.copyOf
从不抛出ClassCastException?