代码运行但给我 java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList

Code runs but gives me java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList

我正在做 ArrayList 的初学者 Java 教程,要求我执行以下操作

// Create a method called removeOdd
    // Remove all the odd numbers from an ArrayList 

    // removeOdd(Arrays.asList(1,2,3,5,8,13,21)) => {2, 8}
    // removeOdd(Arrays.asList(7,34,2,3,4,62,3)) => {34, 2, 4, 62}

下面是我的代码

import java.util.ArrayList;
import java.util.Arrays;


public class Ex4_RemoveOdd {

    public static void main(String[] args) {

        removeOdd((ArrayList<Integer>) Arrays.asList(1,2,3,5,8,13,21));
        removeOdd((ArrayList<Integer>) Arrays.asList(7,34,2,3,4,62,3));
    }

    public static void removeOdd(ArrayList<Integer> list){
        for (int i = 0; i < list.size(); i++){
            int num = list.get(i);
            if (num % 2 != 0){
                list.remove(i);
            }
        }
        System.out.println(list);
    }
}

代码运行,但给出以下错误代码

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

有人知道我做错了什么吗?

我知道在 SO

上还有一个 similar question

但是我认为我们的情况有所不同,因为 OP 没有像我一样在使用 AsList 的方法中声明列表。

非常感谢您的宝贵时间:)

方法Arrays.asList returns a List,但不是java.util.ArrayList。是private嵌套classArrayList,嵌套在Arrays里面,又不一样。它不支持添加或删除生成的列表。

要生成实际的 java.util.ArrayList,请将 List 传递给正确的 ArrayList constructor,这需要一个 Collection,例如

removeOdd(new ArrayList<Integer>(Arrays.asList(1, 2, 3, 5, 8, 13, 21)));

至于为什么内部 class 被称为 java.util.Arrays$ArrayList,那是因为美元符号 $ 将封闭的 class 名称与嵌套的 class 名字.

问题出在这里:

removeOdd((ArrayList<Integer>) Arrays.asList(1,2,3,5,8,13,21));

ArrayList Arrays#asList 返回的 List 不同,堆栈跟踪告诉您:

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

创建一个新的 ArrayList 并将 Arrays#asList 返回的 List 作为参数传递:

removeOdd(new ArrayList<Integer>(Arrays.asList(1,2,3,5,8,13,21)));

Does anyone know what I did wrong?

有两个 类 称为 ArrayList,一个可以直接使用,一个不应该。您不能仅仅因为它们碰巧具有相同的名称就将一个转换为另一个。

幸运的是,您不需要首先执行此操作,因为您不需要指定需要 ArrayList。您可以编写它,以便可以传递任何可变列表。顺便说一句 Arras.aslIst 是一个固定长度,所以你不能在这里使用它。

相反,我建议不要更改列表,而是打印结果。

printEven(Arrays.asList(1,2,3,5,8,13,21));
printEven(Arrays.asList(7,34,2,3,4,62,3));

public static void removeOdd(Iterable<Integer> list) {
    List<Integer> even = new ArrayList<>();
    for (integer i: list) if (i %2 == ) even.add(i);
    System.out.println(even);
}