为什么 List<String>.toArray() 返回 Object[] 而不是 String[]?如何解决这个问题?

2022-09-01 06:47:32

有谁知道为什么Java 1.6有这样的行为:

List<String> list = ArrayList<String>();
String[] arr = (String[]) list.toArray();

我得到了一个ClassCastException,因为它返回Object[]而不是String[]。

我以为应该返回T[] - 不?有没有人有一个答案,为什么这种不便存在于语言中?以及如何解决这个问题?如何在不循环通过项目的情况下从中获取 String[]?List<T>.toArray()List<String>


答案 1

您需要传入数组,以便 其运行时类型可以用作 的提示。请尝试。您还可以传入预先调整大小的数组。toArraytoArray(new String[0])

要理解,请考虑必须执行什么类型擦除才能进行

new T[4]

工作。如果Java允许这样做,那么它在擦除后可以做的最好的事情就是

new Object[4]

大多数实现使用 java.lang.reflect.Array 来构造正确类型的输出数组,给定作为 传递的类型提示。toArrayClass


答案 2

因为数组从一开始就存在于Java中,而泛型只是在Java 5中引入的。该方法是在泛型存在之前在Java 1.2中引入的,因此它被指定为返回。许多现有代码现在希望返回,因此现在无法更改。List.toArray()Object[]List.toArray()Object[]

此外,泛型在运行时被擦除,因此,如果需要,甚至无法构造正确类型的数组。ArrayList

这样做的漏洞是List.toArray(T[])方法,它将返回一个正确类型的数组,前提是你给它一个正确类型的数组,以便它知道要使用什么类型。


推荐