1.public Object[] toArray() {   
  • Object[] result = new Object[size];   
  • System.arraycopy(elementData, 0, result, 0, size);   
  • return result;   
  •    }  
  •  


    String[] to = (String[])to_list.toArray();   

    ArrayList.toArray()返回的Object[]是其创建类型,downcast到其子类String[] 当然是非法的cast,所以会报错。


    2.
    1. public Object[] toArray(Object a[]) {   
    2.     if (a.length < size)   
    3.         a = (Object[])java.lang.reflect.Array.newInstance(   
    4.                             a.getClass().getComponentType(), size);   
    5.     System.arraycopy(elementData, 0, a, 0, size);   
    6.   
    7.     if (a.length > size)   
    8.         a[size] = null;   
    9.   
    10.     return a;   
    11. }  

    它是根据你传进来的那个数组的元素类型进行创建,所以就不会有类型不匹配的问题。

    无参数的实现中,它是按照Object[]进行创建,当然就会存在一个类型匹配的问题了。



    java sdk doc 上讲:
     
          public Object[] toArray(Object[] a)

          a--the array into which the elements of this list are to be stored, if it is big enough; otherwise, a new array of the same  runtime type is allocated for this purpose.

          如果这个数组a足够大,就会把数据全放进去,返回的数组也是指向这个数组,(数组多余的空间存储的是null对象);要是不够大,就申请一个跟参数同样类型的数组,把值放进去,然后返回。



     



    ------君临天下,舍我其谁------