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

标签 java arrays generics

我注意到在 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/

相关文章:

java - 使用 xpath 获取 xml 文件的两个属性

java - ojdbc6.jar 和 ojdbc14.jar 有什么区别?

c - 从指针数组返回字符串的函数

java - 扩展一个类,其中父类的参数扩展了一个类

Java 泛型方法 : super can't be used?

java - 我的 RabbitMQ 订阅代码不起作用

java - 如何在JPA中定义多对多到自身?

java - 为什么每次我创建对象数组的新元素时,之前创建的元素都具有与新元素相同的属性

javascript - 如何在 JavaScript 中将字符串数组转换为对象数组?

java - 什么可能是 ParameterizedType 的实例?