为什么我的类ArrayListTest中的代码末尾的两个方法头出现编译时错误?
ArrayListTest:http://pastebin.com/dUHn9vPr
学生:http://pastebin.com/3Vz1Aytr
我在两行有一个编译器错误:
delete(CS242, s3)
replace(CS242, s, s4);
当我尝试运行代码时,它声明:
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
The method replace(ArrayList<Student>, Student, Student)in the type ArrayListTest is not applicable for the arguments (List<Student>, Student, Student)
The method delete(ArrayList<Student>, Student) in the type ArrayListTest is not applicable for the arguments (List<Student>, Student)
at ArrayListTest.main(ArrayListTest.java:54)
我修复了编译时错误,因为我使用Eclipse和Eclipse提供了可用于修复编译时错误的代码选项。我选择“将方法更改为'替换(ArrayList,学生,学生)'为'替换(列表,学生,学生)'
虽然它修复了编译时错误,但我不明白为什么我开始时遇到编译时错误以及为什么有效地修复了错误
我真的不知道我需要编写哪些代码来纠正以下两种方法:
public static void replace(List<Student> cS242, Student oldItem,
Student newItem) {
public static void delete(List<Student> cS242, Student target){
答案 0 :(得分:2)
那是因为您将ArrayList<Student>
声明为:
List<Student> CS242 = new ArrayList<Student>(25);
您的replace
方法为:
public static void replace(ArrayList<Student> aList, Student oldItem, Student newItem) {
}
对于Java,您将List
的内容传递给仅适用于ArrayList
的方法。 如果允许您这样做,您可以将实施更改为LinkedList<Student>
,并仍然将其传递给replace
这不正确。
使用replace(List<Student>)
,或将CS242
声明为ArrayList<Student> CS242
,但前者被认为是最佳做法。
答案 1 :(得分:0)
在粘贴的代码中,replace
和delete
两种方法不会更改为List<Student>
。这就是造成编译错误的原因。
它们首先存在,因为在第9行中您创建了一个ArrayList并将其保存在List变量中。这很好用,因为ArrayList实现了List,所以每个ArrayList也是一个List。稍后,您尝试将需要ArrayList的函数作为参数调用所述List。虽然这个特定的List也是一个ArrayList(因为您使用了ArrayList构造函数),但并非所有列表都是如此。所以你必须先显式地转换它或者首先将它保存为ArrayList。
答案 2 :(得分:0)
方法public static void replace(ArrayList<Student> aList, Student oldItem, Student newItem)
不允许传递List<Student>
列表类型。
换句话说,第一个参数必须是ArrayList
(或子类)。当您将签名更改为public static void replace(List<Student> aList, Student oldItem, Student newItem)
时,类型CS242
的参数List<Student>
与预期的参数类型匹配。
答案 3 :(得分:0)
对于两种缺失的方法,方法List.indexOf()
和List.remove()
在这里非常宝贵。