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

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

How to instantiate a Java array given an array type at runtime?

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

< T > T[] toArray(T[] a)

Returns an array containing all of the elements in this collection; the runtime type of the returned array is that of the specified array. If the collection fits in the specified array, it is returned therein. Otherwise, a new array is allocated with the runtime type of the specified array and the size of this collection.

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


使用静态方法

1
java.lang.reflect.Array.newInstance(Class< ? > componentType, int length)

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


通过查看 ArrayList 是如何做到的:

1
2
3
4
5
6
7
8
public < T > 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;
}

1
Array.newInstance(Class componentType, int length)


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

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

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


推荐阅读