为什么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://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()]
,这可能会在返回时导致链接出现问题。有人试图按照这些方式给出答案,但答案已被删除,所以我忘了它是谁。
答案 0 :(得分:4)
此方法应该创建一个新数组。但是,如果您没有Class
的{{1}}信息,则无法执行此操作。
你不能说T
如果将数组作为参数传递(就像在其他方法中一样),则没有问题。
答案 1 :(得分:1)
完整的答案是:因为toArray()
的实现无法构造它应该在没有“范例”数组的情况下返回给你的T[]
数组。查看toArray( T[] )
中AbstractCollection
的泛型重载的源代码,以查看差异。
他们也可以用Class< T >
参数完成它。但至少有一个示例,如果你愿意,你可以自己分配空间(并且几乎不可能为泛型Class< G< S > >
生成G< S >
的实例。)
答案 2 :(得分:0)
由于Java中泛型的性质。由于擦除,在运行时没有可用的类型信息,因此no-arg版本只能返回一个对象数组。