我尝试了一个小代码,使用比较排序的学生名单,通过那里的卷号。但我在这行得到编译时错误:
Collections.sort(l);
在我的测试代码下面:
package test;
import java.util*;
public class StudentUsingComparator implements
Comparator<StudentUsingComparator> {
int roll;
String name;
public StudentUsingComparator(int roll, String name) {
this.name = name;
this.roll = roll;
}
@Override
public int compare(StudentUsingComparator s1, StudentUsingComparator s2) {
return s1.roll - s2.roll;
}
public static void main(String[] args) {
StudentUsingComparator student1 = new StudentUsingComparator(10, "ab");
StudentUsingComparator student2 = new StudentUsingComparator(30, "cd");
StudentUsingComparator student3 = new StudentUsingComparator(20, "bc");
List<StudentUsingComparator> l = new ArrayList<StudentUsingComparator>();
l.add(student1);
l.add(student2);
l.add(student3);
System.out.println("unsorted collection is: " + l);
Collections.sort(l); //m getting error in this line
System.out.println("sorted collection is: " + l);
}
}
错误消息显示:
绑定不匹配:集合类型的泛型方法sort(list)不适用于参数list()。推断类型studentusingcomparator不是有界参数的有效替代品>
2条答案
按热度按时间arknldoa1#
你搞糊涂了
Comparable<>
以及Comparator<>
. 具有内在顺序的类应该实现Comparable<>
,则可以使用Collecections.sort(l)
. 当你使用Collections.sort(l,c)
,c
应该实施Comparator<>
,它定义了不同于内部的外部顺序。kpbwa7wx2#
您的代码混合了两个概念:
您可以定义
Student
实现的类Comparable
,则可以使用Collections.sort(l)
分类List<Student> l
.除了你的课
Student
(可能是Comparable
你定义了一个额外的类来实现Comparator<Student>
使用Collections.sort(l,c)
用一个List<Student> l
和一个Comparator<Student> c
.虽然理论上可以把这两种情况混合起来(就像你做的那样),然后
Student
实施Comparator<Student>
(然后继续沿着2的线)这是完全不允许的,因为你的物体有一个自然的顺序-那么你应该按照Comparable
或者他们没有,那么定义顺序应该转到一个单独的Comparator
-班级。