JDK1.6集合框架bug 6260652解析
最近在看JDK的源码:CopyOnWriteArrayList.java和ArrayList.java,这2个类的构造函数,注释中有一句话看不懂。
publicArrayList(Collectionc){ elementData=c.toArray(); size=elementData.length; //c.toArraymight(incorrectly)notreturnObject[](see6260652) if(elementData.getClass()!=Object[].class) elementData=Arrays.copyOf(elementData,size,Object[].class); } publicCopyOnWriteArrayList(Collectionc){ Object[]elements=c.toArray(); //c.toArraymight(incorrectly)notreturnObject[](see6260652) if(elements.getClass()!=Object[].class) elements=Arrays.copyOf(elements,elements.length,Object[].class); setArray(elements); }
上网查了一下资料,才知道see6260652这个编号代表JDKbug库中的编号。可以去官网查看bug详情
http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6260652
http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6515694
6260652和6515694这2个bug,貌似是同一个问题。这个bug是什么意思呢?我们先来看看一些测试代码:
publicstaticvoidtest1() { SubClass[]subArray={newSubClass(),newSubClass()}; System.out.println(subArray.getClass()); //class[Lcollection.SubClass; BaseClass[]baseArray=subArray; System.out.println(baseArray.getClass()); //java.lang.ArrayStoreException baseArray[0]=newBaseClass(); } publicstaticvoidtest2() { Listlist=Arrays.asList("abc"); //classjava.util.Arrays$ArrayList System.out.println(list.getClass()); //class[Ljava.lang.String; Object[]objArray=list.toArray(); System.out.println(objArray.getClass()); objArray[0]=newObject();//causeArrayStoreException } publicstaticvoidtest3() { List dataList=newArrayList (); dataList.add("one"); dataList.add("two"); Object[]listToArray=dataList.toArray(); //class[Ljava.lang.Object;返回的是Object数组 System.out.println(listToArray.getClass()); listToArray[0]=""; listToArray[0]=123; listToArray[0]=newObject(); }
1、关于test1()
SubClass继承自BaseClass,由于SubClass数组中每一个元素都是SubClass对象,所以BaseClass[]baseArray=subArray;这种强制类型转换不会报错。这其实就是java对象的向上转型,子类数组转换成父类数组是允许的。但是由于数组中元素类型都是SubClass类型的,所以baseArray[0]=newBaseClass();会报错java.lang.ArrayStoreException。这也就是说假如我们有1个Object[]数组,并不代表着我们可以将Object对象存进去,这取决于数组中元素实际的类型。
2、关于test2()
List
Object[]objArray=list.toArray();返回是String[]数组,所以我们不能将Object对象,放到objArray数组中。
3、关于test3()
ArrayList对象的toArray()返回就是Object[]数组,所以我们可以将任意对象存放到返回的Object[]数组中。
通过test2和test3可以看出,如果我们有1个List
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。