Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么不是';t List.toArray()泛型?_Java - Fatal编程技术网

Java 为什么不是';t 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

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


更新:从那以后,我了解到不允许创建通用数组,但我认为应该这样做。有什么理由不允许这样做吗

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()];