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

2022-09-02 10:46:13

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

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

参见:Collection.toArray()Collection.toArray(T[])和相关主题java:(String[])List.toArray()给出了ClassCastException


答案 1

这是一个非常好的问题。答案是泛型也被称为“擦除”。它不仅仅是一个名字。泛型编码的信息仅在编译时使用,然后被删除。所以,JVM甚至不知道这个泛型类型,所以它不能创建数组。EE[]

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


答案 2

“类型擦除”只是一个部分解释:和 它的方法都没有关于运行时的任何信息。CollectiontoArray()E

这也是由于向后兼容性,仍然必须返回 。在Java 1.5之前,没有办法知道集合的泛型类型,所以这是唯一合理的API设计。Collection.toArray()Object[]