为什么没有toArray(Class <T>)?

jam*_*s_t 5 java arrays collections toarray

为什么没有仅接受类型的toArray变量List,例如:

Foo[] array = list.toArray(Foo.class);
// or
Foo[] array = list.toArray(Foo[].class);
Run Code Online (Sandbox Code Playgroud)

我见过

// existing array
Foo[] array = list.toArray(array);
// Fake array
Foo[] array = list.toArray(new Foo[0]);
Run Code Online (Sandbox Code Playgroud)

但是,当我只想指定类型而不创建不必要的一次性数组时,创建一个空数组对我来说似乎效率低下并且违反直觉。

Zab*_*uza 6

从接口的角度来看,我同意。

该方法只需要类型(除了副作用),因此只需要类型是合适的。

我想,主要原因是效率。执行仅取型显著慢,我没有检查实施细则虽然(见基准测试.toArray(新MyClass的[0])或.toArray(新MyClass的[myList.size()])?和博客古代智慧的数组)。

但是,请注意,自Java 11以来,我们有了一个新的变体,它更接近您想要的,并且在这种情况下也更合适:

toArray(Foo[]::new)
Run Code Online (Sandbox Code Playgroud)

从其文档中

返回一个包含此集合中所有元素的数组,使用提供的生成器函数分配返回的数组。

使用toArray()以创建一个数组,其运行时类型Object[],或使用toArray(T[])重用现有的阵列。

默认实现会使用零调用generator函数,然后将结果数组传递给toArray(T[])

由于您直接提供生成器,因此该方法不需要反射。

总结一下,如今您应该使用

  • toArray()如果您想要Object[](非常合适),
  • toArray(T[]) 如果您想重用现有的数组(应该足够大),
  • toArray(IntFunction<T[]>) 如果要输入安全性和新数组。

  • @Andreas Iirc在这里有人对其进行了基准测试,传递“ 0”长度的数组比传递正确大小的数组快得多。 (2认同)