为什么以下代码无法执行,尽管它不会从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;
有人能说清楚吗?之前已经提出过同样的问题,并提供了一些解决方案。但是对这个问题的明确解释将非常感激。
答案 0 :(得分:5)
你应该这样做:
String[] b = new String[a.size()];
a.toArray(b);
您收到错误是因为toArray()
返回Object[]
而且这不能归结为String[]
。
答案 1 :(得分:3)
您需要提及数组的类型,否则默认情况下,toArray()
会返回Object
的数组,而这些数组不能简单地投放到String[]
。如果指定了类型,则会调用重载的toArray(T[])
,并返回作为参数提到的数组类型。
String [] b = a.toArray(new String[]{});
答案 2 :(得分:3)
a.toArray()
正在创建Object[]
而不是String[]
,因此类型转换失败。
String[] b = a.toArray(new String[a.size()]);
请参阅javadocs了解List.toArray
的两个重载答案 3 :(得分:0)
查看JavaDoc,toArray()
返回Object[]
数组,该数组无法向下转换为String[]
。
您需要this method - 原因是在运行时删除了泛型,因此JVM不会知道您的ArrayList
曾经是包含String
'的内容S:
String [] b = a.toArray( new String[] {} );
干杯,
答案 4 :(得分: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