【发布时间】:2015-03-12 15:17:44
【问题描述】:
我目前正在研究 Java 集合框架,我一直在问自己一个有趣的问题是“所有这些集合如何实现 Collection#toArray 方法的通用版本”。从我在其他 SO 问题中读到的内容来看,它很可能使用Array#newInstance。仅供参考,这就是 Array#newInstance 的声明方式:
public static Object newInstance(Class<?> componentType,
int... dimensions)
throws IllegalArgumentException,
NegativeArraySizeException
现在,我的问题是:如何使提供给该方法的信息足以生成指定类型的数组对象?
多维方面并不难,因为总是可以将 N-dim 数组构造为 (N-1)-dim 数组的单维数组。
真正困扰我的是如何从通过Class<?> 引用传递的Class<T> 对象创建T[] 类型的对象。
【问题讨论】:
-
在 Oracle JDK 中,
newInstance委托给实际返回新数组的private和native方法。实际的创建是由 JVM 动态完成的。 -
@SotiriosDelimanolis,那么,这种方法实际上是唯一创建类型在运行时提供的数组的方法吗?没有办法使用 Java 本身提供的工具来实现同样的目标?
-
你不能这样做——泛型在运行时不存在。如果再次查看 Collections 的 API,您可以看到 toArray 的空参数版本返回一个 Object[]。要获取参数化/类型化数组,您必须先创建该数组并将其传递给方法。
-
这是 Java 提供的工具。而且,是的,这是唯一的方法(减去一些
Serializable,但忽略它)。