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

zho*_*xin 1 java

这里我有一个 ArrayList List<String> list,我想将它转换为一个数组String[]

所以我检查了ArrayListAPI,得到了一个方法toArray(T[] a),唯一一个具有泛型类型的方法。

我想知道为什么ArrayList下面没有这样的方法?

public <T> T[] toArray(Class<T[]> type) {
    return Arrays.copyOf(elementData, size, type);
}
Run Code Online (Sandbox Code Playgroud)

所以我只是在list.toArray(String[].class)不创建新数组的情况下调用它。它工作我尝试它,我认为它更简单。

当然,也许我没有得到作者关于ArrayList.toArray.

所以想请大家指出我的错误或分享我原始方法的优点toArray(T[] a)。谢谢!:)

And*_*eas 7

因为该方法早于泛型

回到 Java 1.2 创建方法时,它被声明为:

public Object[] toArray(Object[] a)
Run Code Online (Sandbox Code Playgroud)

然后调用者可以创建正确类型的数组,例如String[],并转换返回值。如果数组足够大,则不需要反射来重新调整数组大小,因此性能更好。

从那时起,Java 的性能前景发生了巨大的变化,因此在设计中完成的一些性能考虑现在似乎是不必要的。

设计者还补充说,null如果数组过大,就在列表中的最后一个元素之后立即添加元素,这是一种奇怪的类似 C 的怪癖。我怀疑如果现在设计这种方法会发生这种情况。

泛型在Java 5中加入一些类被改为通用的,比如所有的集合类,所有的现有方法发生了变化,尽可能以适应。某些方法可以更改以实现向后兼容性,例如Map.get(Object key)未更改为 ,Map.get(K key)因为以前get()使用无法在地图中的对象进行调用是有效的。

toArray方法已更改,因为即使更改后它仍然完全向后兼容:

public <T> T[] toArray(T[] a)
Run Code Online (Sandbox Code Playgroud)