这里我有一个ArrayList List<String> list
我想将其转换为数组 String[]
所以我检查了 ArrayList
API,得到一个方法toArray(T[] a)
,唯一具有泛型类型的。
我想知道为什么不 ArrayList
有下面这样的方法吗?
public <T> T[] toArray(Class<T[]> type) {
return Arrays.copyOf(elementData, size, type);
}
所以我就把它称为list.toArray(String[].class)
无需创建新数组。可行,我尝试了一下,我认为它更简单。
当然,也许我没有理解作者关于ArrayList.toArray
的想法。 .
所以恳请大家指出我的错误或者分享一下原来方法的优点toArray(T[] a)
。谢谢你! :)
最佳答案
因为该方法早于泛型。
回到 Java 1.2,当创建该方法时,它被声明为:
public Object[] toArray(Object[] a)
然后调用者可以创建正确类型的数组,例如String[]
,并转换返回值。如果数组的大小足够,则不需要反射来重新调整数组的大小,因此性能更好。
从那时起,Java 的性能格局发生了巨大的变化,因此设计中的一些性能考虑如今似乎没有必要。
设计者还添加了类似 C 语言的奇怪特性:如果数组过大,则将紧接着列表中最后一个元素之后的元素设为 null。我怀疑如果现在设计该方法是否会发生这种情况。
当泛型被添加到Java 5中时,一些类被更改为泛型,例如所有的Collection类,并且所有现有的方法都被尽可能地更改以适应这一点。可以更改某些方法以实现向后兼容性,例如Map.get(Object key)
未更改为 Map.get(K key)
,因为之前调用 get()
是有效的带有无法出现在 map 中的对象。
toArray
方法已更改,因为即使发生更改,它仍然完全向后兼容:
public <T> T[] toArray(T[] a)
关于java - 为什么ArrayList.toArray方法传递数组参数而不是数组类参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59517064/