从对象向下转换为整数运行时错误:java.lang.ClassCastException



运行时异常——java.lang.ClassCastingException

Integer intArr[] = new Integer[arrList.size()];
ArrayList <Integer> arrList =new ArrayList();
intArr=(Integer[])arrList.toArray(); // returns Object class which is downcaste to Integer;

我明白向下铸造是不安全的,但为什么会发生这种情况?我还试图将ArrayList转换为StringIntegerint,但我得到了同样的错误。

试着这样做

intArr = arrList.toArray(new Integer[arrList.size()]);

你得到的是一个类型的Integer数组,而不是一个对象数组。

首先,这并没有将ArrayList绑定到类型Integer

ArrayList <Integer> arrList =new ArrayList();

实际情况是这样的,arrList被赋值给raw类型的ArrayList,但这不是问题。

问题在于,

intArr=(Integer[])arrList.toArray();

由于arrList是原始类型(由于赋值,它被编译器赋值为new ArrayList<Object>()),因此您实际上得到的是Object[]

尝试将arrList分配给new ArrayList<Integer>(),并这样做:

intArr = arrList.toArray(new Integer[arrList.size()]);

这里的问题是,您正在尝试将对象数组转换为整数数组。Array本身就是一个对象,Integer[]不是ArrayList的子类,反之亦然。在这种情况下,您需要做的是强制转换单个项,就像这样:

Integer intArr[] = new Integer[arrList.size()];
for(int i=0; i<intArr.length; i++)
{
    intArr[i] = (Integer)arrList.get(i);
}

当然,如果数组列表中的单个元素不是Integer类型,您可能会得到ClassCastException。

toArray(T[] a)接受一个参数:"a -如果列表足够大,则存储列表元素的数组;否则,一个相同长度的新数组"

"

最新更新