在查看jdk1.8的ArrayList的源码时,发现这个注释,在查找各种资料后发现这是个bug号,可以通过以下链接查看bug的详细信息以及修复情况!
https://bugs.java.com/bugdatabase/view_bug.do?bug_id=6260652
前提知识准备:
package com.tsing0520.interview.List_keyword; public class FatherClass { public void print(){ System.out.print("aaa"); } } package com.tsing0520.interview.List_keyword; public class SonClass extends FatherClass{ public void print(){ System.out.print("bbb"); } } package com.tsing0520.interview.List_keyword; public class SonClassTest { public static void main(String[] args) { SonClass son = new SonClass(); FatherClass f = son; f.print(); //bbb } }
通过测试代码理解这个bug的大致情况:
@Test public void test001() { List<String> list = new ArrayList<>(Arrays.asList("123")); System.out.println(list.getClass());// class java.util.ArrayList Object[] listArray = list.toArray(); System.out.println(listArray.getClass());// class [Ljava.lang.Object; listArray[0] = new Object(); } @Test public void test002() { List<String> asList = Arrays.asList("123456"); System.out.println(asList.getClass());// class java.util.Arrays$ArrayList Object[] asListArray = asList.toArray(); System.out.println(asListArray.getClass());// class [Ljava.lang.String; asListArray[0] = new Object();// java.lang.ArrayStoreException } @Test public void test003() { String[] strArray = { new String() }; Object[] objArray = strArray; objArray[0] = new Object();// java.lang.ArrayStoreException }
java.util.Arrays.ArrayList<E>
private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable { private static final long serialVersionUID = -2764017481108945198L; private final E[] a; @Override public Object[] toArray() { return a.clone(); } //........ }
java.util.ArrayList.toArray()
public Object[] toArray() { return Arrays.copyOf(elementData, size); }
java.util.Arrays.copyOf(T[], int)
@SuppressWarnings("unchecked") public static <T> T[] copyOf(T[] original, int newLength) { return (T[]) copyOf(original, newLength, original.getClass()); }