ArrayList源码阅读c.toArray might (incorrectly) not return Object[] (see 6260652)

来源:互联网 发布:北理工网络教育 编辑:程序博客网 时间:2024/05/20 14:25

今天阅读ArrayList源码,发现如下构造函数:

public ArrayList(Collection<? extends E> c) {        elementData = c.toArray();        if ((size = elementData.length) != 0) {            // c.toArray might (incorrectly) not return Object[] (see 6260652)            if (elementData.getClass() != Object[].class)                elementData = Arrays.copyOf(elementData, size, Object[].class);        } else {            // replace with empty array.            this.elementData = EMPTY_ELEMENTDATA;        }    } 

发现其中一行注释很奇怪
// c.toArray might (incorrectly) not return Object[] (see 6260652)

百度一番发现这是个类型问题。因为不同的类通过toArray方法返回的不一定是Object类型(如下),这样会导致在调用ArrayList增加Object元素的方法的时候出现错误。

public static void Main()    {List<String> list = Arrays.asList("abc");System.out.println(list.getClass());Object[] objArray = list.toArray();System.out.println(objArray.getClass());objArray[0] = new Object();    }
结果:
// java.util.Arrays$ArrayList
// java.lang.String;
// cause ArrayStoreException


要避免这种情况,编写者便判断了下:elementData.getClass() != Object[].class,不通过的话调用Arrays.copyOf方法来实现把类型变为Object。
阅读全文
0 0
原创粉丝点击