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

如何在运行时实例化给定数组类型的Java数组?,java,arrays,collections,Java,Arrays,Collections,在Java集合框架中,集合接口声明以下方法: 返回包含此集合中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。如果集合适合指定的数组,则返回其中。否则,将使用指定数组的运行时类型和此集合的大小分配一个新数组 如果要实现此方法,如何创建仅在运行时才知道的a类型的数组?通过查看ArrayList是如何实现的: Array.newInstance(Class componentType, int length) public <T> T[] toArray(T[] a) {

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

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


如果要实现此方法,如何创建仅在运行时才知道的a类型的数组?

通过查看ArrayList是如何实现的:

Array.newInstance(Class componentType, int length)
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;
}
public T[]toArray(T[]a){
如果(a.长度<尺寸)
a=(T[])java.lang.reflect.Array.newInstance(a.getClass().getComponentType(),size);
System.arraycopy(elementData,0,a,0,size);
如果(a.长度>尺寸)
a[size]=null;
返回a;
}
使用静态方法

java.lang.reflect.Array.newInstance(Class<?> componentType, int length)
java.lang.reflect.Array.newInstance(类componentType,int-length)
有关其使用的教程可在此处找到:

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


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

与这里的所有其他答案不同,这种方法不会创建一个T数组。由于擦除,您可以将其分配给T[],但您不会总是侥幸逃脱。如果在一个特定实例中,T是String,并且您在那里创建的数组(返回到另一个方法并)被分配给String[](不需要强制转换),那么您将得到一个意外的ClassCastException。这是类型污染的一个例子。别这样!
T[] newArray = (T[]) new Object[X]; // where X is the number of elements you want.