今天在看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