如何在运行时给定数组类型实例化Java数组?

在Java集合框架中,Collection接口声明以下方法:

T[] toArray(T[] a)

返回一个包含此collection中所有元素的数组; 返回数组的运行时类型是指定数组的运行时类型。 如果集合适合指定的数组,则返回其中。 否则,将使用指定数组的运行时类型和此集合的大小分配新数组。

如果你想实现这个方法,你将如何创建一个只在运行时知道的a类型的数组?

使用静态方法

 java.lang.reflect.Array.newInstance(Class componentType, int length) 

有关其使用的教程可以在这里找到: http : //java.sun.com/docs/books/tutorial/reflect/special/arrayInstance.html

通过查看ArrayList如何做到:

 public  T[] toArray(T[] a) { if (a.length < size) a = (T[])java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), size); System.arraycopy(elementData, 0, a, 0, size); if (a.length > size) a[size] = null; return a; } 
 Array.newInstance(Class componentType, int length) 

要创建generics类型的新数组(仅在运行时已知),您必须创建一个对象数组,然后将其强制转换为generics类型,然后使用它。 这是Java(擦除)的generics实现的限制。

 T[] newArray = (T[]) new Object[X]; // where X is the number of elements you want. 

然后该函数获取给定(a)的数组并使用它(事先检查它的大小)或创建一个新数组。