代码运行但给我 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);
}
我正在做 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);
}