强制转换 Arrays.asList 导致异常:java.util.Arrays$ArrayList 无法强制转换为 java.util.ArrayList

我是Java的新手,我试图理解为什么第一个代码片段不会导致这个异常,但第二个代码片段会导致这个异常。由于字符串数组在这两种情况下都传递到 Arrays.asList 中,那么这两个代码段难道不应该产生异常还是不产生异常?

Exception in thread "main" java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList

第一个代码段(不会导致异常):

ArrayList<ArrayList<String>> stuff = new ArrayList<ArrayList<String>>();
String line = "a,b,cdef,g";
String delim = ",";
String[] pieces = line.split(delim);
stuff.add((ArrayList<String>) Arrays.asList(pieces));

第二个代码段(导致上述异常):

ArrayList<ArrayList<String>> stuff = new ArrayList<ArrayList<String>>();
String[] titles = {"ticker", "grade", "score"};
stuff.add((ArrayList<String>) Arrays.asList(titles));

如果相关,我在Eclipse Helios中使用JavaSE 1.6。


答案 1

对于我(使用Java 1.6.0_26),第一个片段给出了与第二个片段相同的异常。原因是 Arrays.asList(..) 方法只返回 一个 , 而不一定是 .因为您并不真正知道该方法返回哪种类型(或实现),因此您的强制转换是不安全的。结果是它可能会或可能不会按预期工作。从编码风格的角度来看,解决这个问题的一个好方法是将声明更改为:ListArrayListListArrayList<String>stuff

List<List<String>> stuff = new ArrayList<List<String>>();

这将允许添加从该方法中得出的任何内容。Arrays.asList(..)


答案 2

如果这样做,您将不会获得任何 CCE:

ArrayList<ArrayList<String>> stuff = new ArrayList<ArrayList<String>>();
String[] titles = {"ticker", "grade", "score"};
stuff.add(new ArrayList<String>(Arrays.asList(titles)));

正如错误明确指出的那样,该类与嵌套的静态类不同。因此,例外。我们通过使用 .java.util.ArrayListjava.util.Arrays.ArrayListjava.util.ArrayList