java - 为什么 Java 的 Collection<E>.toArray() 返回 Object[] 而不是 E[]?

标签 java generics collections toarray

在 Java 泛型之前,Collection.toArray()无法知道开发人员期望的数组类型(特别是对于空集合)。据我了解,这是成语 collection.toArray(new E[0]) 背后的主要理由。 .

对于泛型,Collection<E>.toArray()只能返回一个包含 E 实例的数组和/或其专长。我想知道为什么返回类型仍然是 Object[]而不是 E[] .在我看来,返回 E[]而不是 Object[]不应破坏现有代码。

见: Collection.toArray() , Collection.toArray(T[]) 和相关主题java: (String[])List.toArray() gives ClassCastException

最佳答案

这是一个很好的问题。答案是泛型也称为“删除”。它不仅仅是一个名字。泛型编码的信息仅在编译时使用,然后被删除。所以,JVM 甚至不知道这个泛型 E ,因此无法创建数组 E[] .

其他方法toArray(T[] a)在运行时从参数接收有关类型的信息。这就是这个方法的原型(prototype)是 <T> T[] toArray(T[] a) 的原因。 :它获取类型为 T 的数组,并且可以返回类型为 T 的数组。类型作为参数传递。

关于java - 为什么 Java 的 Collection<E>.toArray() 返回 Object[] 而不是 E[]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6173495/

相关文章:

java - 为什么JSTL有sql相关标签

java热交换一个库

generics - 如何访问在 F# 中声明为泛型参数的类型的静态成员

c# - 为什么动态类型可以在类型转换不起作用的地方工作?

java - 是否有任何 java 集合包装器/集合在多线程访问时失败?

java - 如何创建将数组放入新数组的集合构造函数

c# - 父节点内列表的序列化(集合扁平化)

java - Apache POI,如何修改Excel文件中的条件格式范围?

java - 在 Struts2 拦截器中使用资源包

java - 使用泛型类型参数作为方法参数而不是使用对象类型有什么用?