template怎么用 - java type inference




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

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

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

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

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


原因有两个:

  1. 该方法在Generics之前,并且在不破坏向后兼容性的情况下无法更改签名。

  2. 在任何情况下,由于List的构造没有Class<T> ,因此实现无法构造类型为T的数组。


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

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

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



解决方法是使用:

       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()]);




generics