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

jus*_*mer 29 java generics

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

List<String> list = ArrayList<String>();
String[] arr = (String[]) list.toArray();
Run Code Online (Sandbox Code Playgroud)

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

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

Mik*_*uel 21

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

要理解,请考虑要进行哪种类型的擦除

new T[4]
Run Code Online (Sandbox Code Playgroud)

工作.如果Java允许的话,那么擦除后最好的就是

new Object[4]
Run Code Online (Sandbox Code Playgroud)

在给定作为a传递的类型提示的toArray情况下java.lang.reflect.Array,大多数实现用于构造正确类型的输出数组Class.

  • 或者使用`toArray(new String [list.size()])`如果你想避免分配一个0号数组 (9认同)

Dan*_*den 13

因为数组从一开始就使用Java,而泛型仅在Java 5中引入.并且该List.toArray()方法在Java 1.2中引入,在泛型存在之前,因此它被指定返回Object[].现在有很多现有代码需要List.toArray()返回Object[],因此现在无法更改.

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

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