c.toArray might (incorrectly) not return Object[] (see 6260652)

在查看jdk1.8的ArrayList的源码时,发现这个注释,在查找各种资料后发现这是个bug号,可以通过以下链接查看bug的详细信息以及修复情况!

https://bugs.java.com/bugdatabase/view_bug.do?bug_id=6260652

前提知识准备:

package com.tsing0520.interview.List_keyword;

public class FatherClass {
    
    public void print(){
        System.out.print("aaa");
    }
}


package com.tsing0520.interview.List_keyword;

public class SonClass extends FatherClass{
    public void print(){
        System.out.print("bbb");
    }
}


package com.tsing0520.interview.List_keyword;

public class SonClassTest {
    
    public static void main(String[] args) {
        SonClass son = new SonClass();
        FatherClass f = son;
        f.print(); //bbb
    }
}

通过测试代码理解这个bug的大致情况:

    @Test
    public void test001() {
        List<String> list = new ArrayList<>(Arrays.asList("123"));
        System.out.println(list.getClass());// class java.util.ArrayList
        Object[] listArray = list.toArray();
        System.out.println(listArray.getClass());// class [Ljava.lang.Object;
        listArray[0] = new Object();
    }

    @Test
    public void test002() {
        List<String> asList = Arrays.asList("123456");
        System.out.println(asList.getClass());// class  java.util.Arrays$ArrayList
        Object[] asListArray = asList.toArray();
        System.out.println(asListArray.getClass());// class [Ljava.lang.String;
        asListArray[0] = new Object();// java.lang.ArrayStoreException
    }

    @Test
    public void test003() {
        String[] strArray = { new String() };
        Object[] objArray = strArray;
        objArray[0] = new Object();// java.lang.ArrayStoreException
    }

java.util.Arrays.ArrayList<E>

  private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable
    {
        private static final long serialVersionUID = -2764017481108945198L;
        private final E[] a;

        @Override
        public Object[] toArray() {
            return a.clone();
        }
        
        //........
}

java.util.ArrayList.toArray()

  public Object[] toArray() {
        return Arrays.copyOf(elementData, size);
    }
扫描二维码关注公众号,回复: 7074492 查看本文章

java.util.Arrays.copyOf(T[], int)

    @SuppressWarnings("unchecked")
    public static <T> T[] copyOf(T[] original, int newLength) {
        return (T[]) copyOf(original, newLength, original.getClass());
    }

猜你喜欢

转载自www.cnblogs.com/tsing0520/p/11392151.html