使用toArray将列表转换为数组

Jos*_*osh 0 java arrays list dynamic-allocation

请阅读问题而不是假设这是重复的.

在我正在处理的代码库中,我有一个Foo对象列表:

private List<Foo> fooList;
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释这行代码之间的区别:

Foo foos[] = fooList.toArray(new Foo[fooList.size()]);
Run Code Online (Sandbox Code Playgroud)

这条线?

Foo foos[] = (Foo[]) fooList.toArray();
Run Code Online (Sandbox Code Playgroud)

Roh*_*ain 6

不同的是,第二个会ClassCastException在运行时抛出一个.无参数List#toArray()方法在Object[]内部创建,您无法转换为Foo[].由于通用类型信息被编译器擦除,因此在运行时不知道列表的类型.因此,您无法知道创建数组的实际类型(即,您无法创建类似的数组 - new T[size]).这就是它创造一个原因的原因Object[].

为了解决这个问题,我们可以使用通用方法List#toArray(T[]),您可以传递实际数组,该数组将由元素填充ArrayList.如果数组的大小不足以适合元素,则会在内部创建一个新数组.因此,自从您通过后new Foo[fooList.size()],它将被列表中的元素填充.但是,如果你通过了new Foo[0],那么就会创建一个新数组.