运行时异常——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
转换为String
到Integer
到int
,但我得到了同样的错误。
试着这样做
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 -如果列表足够大,则存储列表元素的数组;否则,一个相同长度的新数组"