gpt4 book ai didi

java - 是否有 Array.newInstance 的通用版本?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:35:50 25 4
gpt4 key购买 nike

我注意到在 Java 中 Array.newInstance() 返回 Object,而不是 T[]。这是可以理解的,因为这个方法是在 Java 支持泛型类型之前引入的。

然而,令人惊讶的是没有等效的通用版本。 Java 7 的 Arrays.copyOf 不一样 - 它复制参数的内容,而不是创建一个新的虚拟数组(其中包含所有空对象)。

既然这个实现看起来微不足道,有什么理由不把它添加到 JRE 中吗?或者我就是找不到?

更新

看来我应该提供我自己的“简单”实现来阻止对问题的误解。

class MyArrayUtil {
//Generic version for classes
@SuppressWarnings("unchecked")
public static <T> T[] newArrayOf(T[] t, int len){
return (T[]) Array.newInstance(t.getClass().getComponentType(), len);
}
//For array of int
public static int[] newArrayOf(int[] t, int len){
return new int[len];
}
//For other primitive types...
}

我不会将此代码作为答案发布,因为它不是问题的答案。问题是原因和/或现有代码,而不是如何实现。

更新

我已经更新了代码,使其类似于Arrays.copyOf,优点是程序员可以简单地改变参数的类型来调整代码为另一种类型。此外,我取消了对基本类型使用 Array.newInstance

最佳答案

Guava 提供 just such a function .这不是 Guava(或 Apache Commons)第一次提供 JDK 没有的常用帮助程序,无论出于何种原因。

您可能知道这一点,但对于将来偶然发现这一点的 google 员工来说,有一些背景知识:签名不能通用的原因是方法 Array.newInstance returned Object in Java 1.4 ,因此为了向后兼容,该方法的原始版本也应返回 Object。如果它被泛化为:

<T> T[] newInstance(Class<T> componentType, int length)

...那么返回类型将是 Object[],而不是 Object。这会破坏向后兼容性,而 Java 设计者一直非常努力地避免这样做。

Arrays.copyOf 方法仅在 Java 1.6 中出现,因此不必担心向后兼容性。

关于java - 是否有 Array.newInstance 的通用版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17737416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com