使用 Java toArray 遇到的问题
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
//list.toArray() 返回的是一个 Object[] 类型的数组
Integer[] arr = (Integer[]) list.toArray();
}
//Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
- 抛出 ClassCastException
Java toArray
有两个方法。
不带参数的 toArray
public Object[] toArray() {
Object[] result = new Object[size];
System.arraycopy(elementData, 0, result, 0, size);
return result;
}
- 不带参数的
toArray
方法,是构造的一个 Object 数组,然后进行数据拷贝,此时进行转型就会产生ClassCastException。
带参数的 toArray
@SuppressWarnings("unchecked")
public <T> T[] toArray(T[] a) {
if (a.length < size)
// Make a new array of a's runtime type, but my contents:
return (T[]) Arrays.copyOf(elementData, size, a.getClass());
System.arraycopy(elementData, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}
- 带参数的
toArray
方法,则是根据参数数组的类型,构造了一个对应类型的,长度跟 ArrayList 的 size 一致的空数组,虽然方法本身还是以 Object 数组的形式返回结果,不过由于构造数组使用的 ComponentType 跟需要转型的 ComponentType 一致,就不会产生转型异常。
解决方法
//1
Integer[] arr = new Integer[<total size>];
list.toArray(arr);
//2
Integer[] arr = (Integer[]) list.toArray(new Integer[0]);
//3
Integer[] a = new Integer[<total size>];
Integer[] arr = list.toArray(a);
网友评论