是否有任何通用版本的Array.newInstance?

Ear*_*ine 8 java arrays generics

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

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

由于实现这一点似乎微不足道,有没有理由不将它添加到JRE中?或者我找不到一个?

UPDATE

我似乎会提供自己的"琐碎"实施来阻止对这个问题的误解.

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...
}
Run Code Online (Sandbox Code Playgroud)

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

UPDATE

我已经更新了代码以使其类似Arrays.copyOf,并且优点是程序员可以简单地更改参数的类型以调整其他类型的代码.我也删除了Array.newInstance原始类型的使用.

ysh*_*vit 8

番石榴提供了这样的功能.这不是Guava(或Apache Commons)第一次提供JDK没有的常用帮助器,无论出于何种原因.

你可能知道这一点,但是谷歌将来偶然发现这个问题的一些背景:签名不能通用的原因是Java 1.4中Array.newInstance 返回Object的方法,所以为了向后兼容,方法的原始版本应该也回来了Object.如果它被广泛化为:

<T> T[] newInstance(Class<T> componentType, int length)
Run Code Online (Sandbox Code Playgroud)

...然后返回类型将是Object[],而不是Object.这会打破向后兼容性,Java设计人员一直很努力不去做.

这些Arrays.copyOf方法只与Java 1.6一起提供,因此不必担心向后兼容性.