List list = new ArrayList();
list.add(new Long(1));
// ❌ 錯誤:拋出 ClassCastException
Long[] arr = (Long[]) list.toArray();
原因:無參 toArray() 返回 Object[],無法強轉為 Long[],因陣列型別在運行時具體化,Object[] 不是 Long[] 的子型別。
// ✅ 正確:傳入目標型別陣列(長度建議 = list.size())
Long[] arr = list.toArray(new Long[list.size()]);
JDK 內部會:
null,使用時需檢查。new Long[0] 同樣可行,JDK 會自動創建適當大小新陣列,甚至可能利用緩存提升效能(JDK 6+)。List<Long>,編譯器會提示型別不匹配。import java.util.*;
public class ToArrayDemo {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add(1L);
list.add(2L);
list.add(3L);
// 方式一:零長度陣列(推薦)
Long[] arr1 = list.toArray(new Long[0]);
System.out.println(Arrays.toString(arr1)); // [1, 2, 3]
// 方式二:精確長度
Long[] arr2 = list.toArray(new Long[list.size()]);
System.out.println(Arrays.toString(arr2));
// 方式三:較大陣列(尾部補 null)
Long[] arr3 = list.toArray(new Long[5]);
System.out.println(Arrays.toString(arr3)); // [1, 2, 3, null, null]
}
}
// ArrayList.toArray(T[] a)
public T[] toArray(T[] a) {
if (a.length < size)
return (T[]) Arrays.copyOf(elementData, size, a.getClass());
System.arraycopy(elementData, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}
關鍵點:a.getClass() 獲取運行時陣列型別(如 Long[]),Arrays.copyOf 据此創建同型別新陣列,保證型別安全。
List.toArray() 看似簡單,實則藏著型別擦除與陣列協變的坑。牢記「傳入目標型別陣列」原則,優先使用 new T[0] 或 new T[list.size()],即可避開 ClassCastException,寫出健壯代碼。