There is no E[] toArray() method. Why?
在执行时它无法实际创建E [],因为由于类型擦除它不会知道要创建的数组的类型.
add方法实际上会接受任何东西,但编译器只是先检查参数类型是否与E兼容.在执行时不需要知道任何事情.同样,对于像List.get这样的东西,编译器会将一个强制转换插入到调用代码中:
List strings = new ArrayList<>();
strings.add("hello");
String first = strings.get(0);
编译为与此pre-generics代码相同的代码:
List strings = new ArrayList();
strings.add("hello");
String first = (String) strings.get(0);
现在这很好,因为我们知道调用代码执行时的String类型…但是在toArray()中,创建数组的代码需要知道类型…而类型擦除意味着它实际上并不存在我知道.传递给toArray()的数组允许它创建相同类型的数组.实际上,创建的对象的实际类型可以显示为依赖于您传入的数组:
import java.util.*;
public class Test {
public static void main(String[] args) {
List objects = new ArrayList();
objects.add("xyz");
Object[] array1 = objects.toArray(new String[0]);
Object[] array2 = objects.toArray(new Object[0]);
System.out.println(array1.getClass()); // class [Ljava.lang.String;
System.out.println(array2.getClass()); // class [Ljava.lang.Object;
}
}
如果我们传入新的Integer [0]它会编译,但是当toArray试图将String(唯一的元素)强制转换为Integer时,我们会得到一个ClassCastException.