【发布时间】:2013-07-18 05:27:09
【问题描述】:
我注意到在 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。
【问题讨论】:
-
不,不可能以编译时类型安全的方式实现这一点。例如,您不能创建 a 的新实例:
List<T>[]。编译器永远不会知道T的类型是什么,所以它不能保证客户端代码是安全的。 -
既然
Arrays.copyOf可以完成这项工作,没有明显的理由你不能。 -
Arrays.copyOf确定要复制的数组的具体类型。 -
所以有一个类似的
Arrays.newInstanceOf使用具体类型来提供类型信息很好,正如我在问题中所说的那样,实现是微不足道的。 -
fwiw,Guava 提供just such a method。