美文网首页
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