2

为什么下面的代码无法执行,尽管它不会从 IDE 检测为错误。它会编译得很好。

 ArrayList<String> a = new ArrayList<String>();
    a.add("one");
    a.add("two");
    a.add("three");
    String [] b = (String[])a.toArray();
    for(int i =0;i<b.length;++i){
        System.out.println(b[i]);
    }

但它会给出以下错误。

嵌套异常是 java.lang.ClassCastException: [Ljava.lang.Object; 不能转换为 [Ljava.lang.String;

谁能给个明确的解释?之前也问过同样的问题,并提供了一些解决方案。但对问题的清晰解释将不胜感激。

4

5 回答 5

5

你应该简单地做:

String[] b = new String[a.size()];
a.toArray(b);

您收到错误是因为toArray()返回Object[],而这不能归结为String[].

于 2013-11-21T11:05:22.640 回答
3

您需要提及数组的类型,否则默认情况下toArray()将返回一个Object不能简单地转换为String[]. 如果您指定类型,toArray(T[])将调用重载,返回作为参数提到的数组类型。

String [] b = a.toArray(new String[]{});
于 2013-11-21T11:06:24.090 回答
3

a.toArray()正在创建 aObject[]而不是 a String[],因此类型转换失败。

 String[] b = a.toArray(new String[a.size()]);

有关List.toArray的两个重载,请参阅 javadocs

于 2013-11-21T11:12:55.990 回答
0

看看JavaDoctoArray()返回一个Object[]数组,不能向下转换为String[].

您将需要此方法- 原因是泛型在运行时被删除,因此 JVM 不会知道您ArrayList曾经是一个包含String's:

String [] b = a.toArray( new String[] {} );

干杯,

于 2013-11-21T11:06:43.680 回答
0

(现在/将来可能会有所帮助的东西。)

从 1.5 开始,您可以这样做:

for(String output : a) { // Loops through each a (which is a String)
 System.out.println(output); // As it is a String list we can just print it
}

这更具可读性,并且可能会派上用场。

输出:

one
two
three
于 2013-11-21T11:14:47.907 回答