java-bug id:6260652引发的学习

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ytlviv1985/article/details/79289261

今天在看CopyOnWriteArrayList时看到一个注解// c.toArray might (incorrectly) not return Object[] (see 6260652),特意查了一下做下笔记加深理解和记忆

    public CopyOnWriteArrayList(Collection<? extends E> c) {
        Object[] elements;
        if (c.getClass() == CopyOnWriteArrayList.class)
            elements = ((CopyOnWriteArrayList<?>)c).getArray();
        else {
            elements = c.toArray();
            // c.toArray might (incorrectly) not return Object[] (see 6260652)
            if (elements.getClass() != Object[].class)
                elements = Arrays.copyOf(elements, elements.length, Object[].class);
        }
        setArray(elements);
    }

java编程经常用到多态,父类应用指向子类实现

class P{}

class S extends P{}

P p=new S();

p.getClass()返回的是S,是具体的new的那个对象

那么假如有如下代码:

P[] p=new P[1];

p[0]=new S(); 

这里相当于P p=new S[]; 这个子类肯定有父类的所有特征,这个没有问题,但是

P[] p=new S[1];

p[0]=new P();

这是就是抛一个运行异常ArrayStoreException试图将错误类型的对象存储到一个对象数组,这里相当于S s=new P();这说不过去,父类不一定有子类的特性

所以上面的代码发现非Object类后自己生成一个Object[]防止这种错误

获取数组元素class的方法

P[] p=new P[];

p.getClass().getComponentType(); 非数组都返回null




猜你喜欢

转载自blog.csdn.net/ytlviv1985/article/details/79289261