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)
不同的是,第二个会ClassCastException在运行时抛出一个.无参数List#toArray()方法在Object[]内部创建,您无法转换为Foo[].由于通用类型信息被编译器擦除,因此在运行时不知道列表的类型.因此,您无法知道创建数组的实际类型(即,您无法创建类似的数组 - new T[size]).这就是它创造一个原因的原因Object[].
为了解决这个问题,我们可以使用通用方法List#toArray(T[]),您可以传递实际数组,该数组将由元素填充ArrayList.如果数组的大小不足以适合元素,则会在内部创建一个新数组.因此,自从您通过后new Foo[fooList.size()],它将被列表中的元素填充.但是,如果你通过了new Foo[0],那么就会创建一个新数组.