为什么List.toArray()不通用?

时间:2013-10-15 18:31:03

标签: java

为什么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()]没有任何内在错误,其中MyList<String>将转换为new String[size()],但T本身可以是参数化类型。因此,如果您要创建MyList<Set<Integer>>,那么T将等于Set<Integer>,并且编译器会尝试创建new Set<Integer>[size()],这可能会在返回时导致链接出现问题。有人试图按照这些方式给出答案,但答案已被删除,所以我忘了它是谁。

3 个答案:

答案 0 :(得分:4)

此方法应该创建一个新数组。但是,如果您没有Class的{​​{1}}信息,则无法执行此操作。

你不能说T

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

答案 1 :(得分:1)

完整的答案是:因为toArray()的实现无法构造它应该在没有“范例”数组的情况下返回给你的T[]数组。查看toArray( T[] )AbstractCollection的泛型重载的源代码,以查看差异。

他们也可以用Class< T >参数完成它。但至少有一个示例,如果你愿意,你可以自己分配空间(并且几乎不可能为泛型Class< G< S > >生成G< S >的实例。)

答案 2 :(得分:0)

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