Java Collections ArrayList,LinkedList强制转换异常

Dmi*_*tri 2 java collections arraylist classcastexception

我找到了一个奇怪的案例,到目前为止我无法解释.

 public static void main(String[] args) {
    LinkedList<Integer> a = new LinkedList<>();
    a.add(2);
    a.add(3);
    a.add(4);

    for (ArrayList ax : getBatches(a)){
        System.out.println(ax);
    }

}

private static ArrayList<ArrayList<Integer>> getBatches(List<Integer> optionIds) {
        return new ArrayList(Arrays.asList(optionIds));
}
Run Code Online (Sandbox Code Playgroud)

执行结果是:

线程"main"中的异常java.lang.ClassCastException:java.util.LinkedList无法强制转换为java.util.ArrayList

for循环中的异常.

问题是:如何?返回类型ArrayList <ArrayList <Integer >>的方法如何返回LinkedList?

Era*_*ran 5

您的方法返回raw ArrayList,这就是编译器允许的原因.但是,在运行时期间,会尝试将LinkedList(传递给您的getBatches方法的实例)强制转换为a ArrayList,导致ClassCastException.

如果您将方法更改为:

private static ArrayList<ArrayList<Integer>> getBatches(List<Integer> optionIds) {
    return new ArrayList<>(Arrays.asList(optionIds));
}
Run Code Online (Sandbox Code Playgroud)

你会得到一个编译错误.

要避免编译和运行时错误,您需要将List传递给您的方法转换为ArrayList:

private static ArrayList<ArrayList<Integer>> getBatches(List<Integer> optionIds) {
    return new ArrayList<>(Arrays.asList(new ArrayList<>(optionIds)));
}
Run Code Online (Sandbox Code Playgroud)

这将返回一个ArrayList元素,其元素ArrayList包含与List传递给方法相同的元素.