Java 为什么不是';t List.toArray()泛型?
为什么List.toArray()不是通用的?为什么必须将该类型作为参数(通常创建一个新的空实例)Java 为什么不是';t List.toArray()泛型?,java,Java,为什么List.toArray()不是通用的?为什么必须将该类型作为参数(通常创建一个新的空实例) 更新:从那以后,我了解到不允许创建通用数组,但我认为应该这样做。有什么理由不允许这样做吗 Main.java:28: error: generic array creation T[] ret = new T[size()]; 更新:好的,我相信这就是答案: 不是因为它直接相关,而是间接相关。new T[size()]本身并没有什么问题,其中MyList将转换为new
更新:从那以后,我了解到不允许创建通用数组,但我认为应该这样做。有什么理由不允许这样做吗
Main.java:28: error: generic array creation
T[] ret = new T[size()];
更新:好的,我相信这就是答案:
不是因为它直接相关,而是间接相关。
new T[size()]
本身并没有什么问题,其中MyList
将转换为new String[size()]
,但T本身可能是一个参数化类型。因此,如果要创建MyList
,那么T
将等于Set
,编译器将尝试创建new Set[size()]
,这可能导致返回链接时出现问题。有人试图给出这样一个答案,但这个答案后来被删除了,所以我忘了是谁。因为Java中泛型的本质。由于擦除,在运行时没有可用的类型信息,因此无参数版本只能返回一个对象数组。此方法应创建一个新数组。但是,如果您没有t
的Class
信息,您就不能这样做
不能说T[]array=newt[list.size()]代码>
如果将数组作为参数传递(就像在另一个方法中一样),则没有问题。完整的答案是:因为toArray()
的实现无法构造T[]
数组,因此它应该返回给您,而不带“示例”数组。查看AbstractCollection
中的toArray(T[])
泛型重载的源代码,以查看差异
他们也可以用类
参数来完成。但至少有了一个示例,如果您愿意,您可以自己分配空间(对于泛型类型G
,几乎不可能生成类
的实例).有一个重载版本的toArray
,它是genericScroll,稍微向下一点。@Dgrin91但您必须将数组实例作为参数传入,这就是OP所要问的。为了保持向后兼容性,@GriffeyDog可能重复,他们不能更改返回类型,除非同时添加t参数,这正是Kayaman所说的。您是对的,他们创建了一个重载来保持向后兼容性,因为原始的toArray()
从1.2开始就存在,而通用的从1.5开始就存在。
Main.java:28: error: generic array creation
T[] ret = new T[size()];