5

为什么 List.toArray() 不是通用的?为什么必须将类型作为参数提供(并且通常创建一个新的空实例)?

public Object[] toArray()

http://docs.oracle.com/javase/7/docs/api/java/util/List.html#toArray()


更新:从那以后,我了解到不允许创建通用数组,但我相信它应该是。有什么不被允许的理由吗?

Main.java:28: error: generic array creation
        T[] ret = new T[size()]; 

http://ideone.com/3nX0cz


更新:好的,我相信这是答案:

http://docs.oracle.com/javase/tutorial/java/generics/restrictions.html#createArrays

不是因为它直接相关,而是间接相关。new T[size()], whereMyList<String>会变成本质上没有任何问题new String[size()],但 T 本身可以是参数化类型。因此,如果您要创建MyList<Set<Integer>>, thenT将等于Set<Integer>并且编译器将尝试创建new Set<Integer>[size()],这可能会导致返回时链接出现问题。有人试图按照这些思路给出答案,但该答案已被删除,所以我忘记了它是谁。

4

3 回答 3

4

此方法应该创建一个新数组。但是,如果您没有 的Class信息T,则不能这样做。

你不能说T[] array = new T[list.size()];

如果您将数组作为参数传递(如在其他方法中),则没有问题。

于 2013-10-15T18:43:30.873 回答
1

The complete answer is: because the implementation of toArray() is not able to construct the T[] array it's supposed to return to you without the "exemplar" array. Look at the source code of the generic overload of toArray( T[] ) in AbstractCollection to see the difference.

They also could have done it with a Class< T > argument. But at least with an exemplar you can allocate the space yourself if you want to (and it's nearly impossible to produce an instance of Class< G< S > > for a generic type G< S >).

于 2013-10-15T18:58:07.727 回答
0

由于 Java 中泛型的性质。由于擦除,在运行时没有可用的类型信息,因此无参数版本只能返回一个对象数组。

于 2013-10-15T18:36:14.730 回答