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




java generics详解 (4)

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

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

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

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


Answer #1

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

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

new T[4]

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

new Object[4]

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


Answer #2

解决方法是使用:

       List<String> list = new ArrayList<>();
         list.add("Sputnik");
         list.add("Explorer");

        //String[] str = list.toArray(); 

这必然抛出一个:不兼容的类型:Object []无法转换为String []错误

       Instead use:

        String[] str = list.toArray(new String[0]);
        or
        String[] str = list.toArray(new String[list.size()]);

Answer #3

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

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

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






generics