最近学习jdk1.8源码时,发现ArrayList(Collection<? extends E> c)这个构造函数中,有句有意思的描述:c.toArray might (incorrectly) not return Object[] (see 6260652),

做了一些实验后均没能解释why!而后发现通过正常方式创建的Collection参数都是不会有问题的,问题出在这个Collection参数如果通过某些方式创建得到,就会出现如题的问题!

public static void main(String[] args) {
        Integer[] array = {1, 2};
        // 通过Arrays转换成的List,保留了原本的类型
        List list = Arrays.asList(array);

        // 即使再将其转换为Object类型的数组,还是原本的类型
        Object[] array3 = list.toArray();
        System.out.println("通过数组转换:" + (array3.getClass() == Object[].class));

        // 如果是创建的集合,则类型可以转换
        List<Integer> li = new ArrayList<Integer>();
        System.out.println("通过集合转换:" + (li.toArray().getClass() == Object[].class));
    }

运行结果:

02-13 11:14