java - 为什么ArrayList.toArray方法传递数组参数而不是数组类参数?

标签 java

这里我有一个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/

相关文章:

java - CrudRepository 生成了一个困惑的 Sql 请求

java - 使用jdbc连接器在java中的一个查询中进行多个选择-Mysql

java - 使用正则表达式替换所有非数字、逗号或点的字符

java - 如何衡量C#和Java内存使用的差异?

java - Jasper 报告错误 : compiler class not found : org. codehaus.mojo.jasperreports.MavenJavacCompiler

java - IntelliJ : Does multiple runs are running independently

java - 当向 JTextArea 输入大量文本时,JTextFields 和 JTextArea 会缩小

java - 是否可以使用 Java 加密体系结构访问 SCrypt?

java - 与java中当前日期的日期差异

java - 使用 SWTBot 递归匹配 Shell 的所有 Widget