代码运行但是给了我java.util.Arrays $ ArrayList不能强制转换为java.util.ArrayList

时间:2015-01-14 22:26:21

标签: java exception 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在方法中声明一个列表。

非常感谢您的时间:)

3 个答案:

答案 0 :(得分:3)

方法Arrays.asList returns a List,但它不是java.util.ArrayList。它是嵌套在private内的ArrayList嵌套类Arrays,并且它有所不同。它不支持添加或删除生成的列表。

要制作实际的java.util.ArrayList,请将List传递给合适的ArrayList constructor,其中需要Collection,例如

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

至于为什么内部类被称为java.util.Arrays$ArrayList,这是因为美元符号$将封闭的类名与嵌套的类名分开。

答案 1 :(得分:1)

  

有谁知道我做错了什么?

有两个名为ArrayList的类,一个可以直接使用,另一个则不应该使用。你不能仅仅因为它们具有相同的名称而将其中一个投射到另一个。

幸运的是,您不需要首先执行此操作,因为您不需要指定需要ArrayList。您可以编写它,以便可以传递任何可变列表。 BTW 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);
}

答案 2 :(得分:0)

问题在于:

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

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

  

线程“main”中的异常java.lang.ClassCastException:java.util.Arrays $ ArrayList 无法强制转换为 java.util.ArrayList

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

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