美文网首页
Java toArray()

Java toArray()

作者: PC_Repair | 来源:发表于2019-09-16 11:03 被阅读0次

使用 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);

相关文章

网友评论

      本文标题:Java toArray()

      本文链接:https://www.haomeiwen.com/subject/xepxuctx.html