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