20

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

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

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

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

4

4 回答 4

34

使用静态方法

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

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

于 2008-09-16T21:44:12.320 回答
20

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

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;
}
于 2008-09-16T21:39:47.807 回答
3
Array.newInstance(Class componentType, int length)
于 2008-09-16T21:39:29.243 回答
-1

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

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

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

于 2008-09-16T21:44:45.673 回答