以下代码有什么问题?
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;
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;
你不能将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;
}
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
您尝试将一个Object数组转换为强制转换为Array of Integer。你不能这样做。不允许这种类型的向下转发。
您可以创建一个Integer数组,然后将第一个数组的每个值复制到第二个数组中。
instanceof
test should pass in order for the assignment to go through.
In your example it results
Object[] a = new Object[1];
boolean isIntegerArr = a instanceof Integer[]
sysout
of the above line, it would return false;
(Arrays.asList(a)).toArray(c);