假设我有一个带有属性名称和id的Student类。我想使用List
方法按照各自ID的自然顺序对Collections.sort()
个学生进行排序。我可以通过以下两种方式来实现:
public class Student implements Comparable<Student> {
private Long id;
private String name;
// getters and setters..
public int compareTo(Student student){
return this.getId().compareTo(student.getId());
}
}
另一种方式是:
public class Student implements Comparable<Long> {
private Long id;
private String name;
// getters and setters..
public int compareTo(Long id){
return this.getId().compareTo(id);
}
}
然后使用Collections.sort()
方法对学生列表进行排序。我的问题或困惑是,如果我们使用一个而不是其他产生相同的结果,它会产生什么差异。
答案 0 :(得分:2)
如果您实施Comparable<Long>
,则Collections.sort()
将无法在List<Student>
上使用它,因为Collections.sort()
将无法确定从哪里获取Long
1}}从传递到compareTo(Long)
。
答案 1 :(得分:2)
Comparable的类型参数决定了你的类型可以与哪种类型的对象相比较。在前一个例子中,你让学生相互比较,在后一个例子中,你让学生与Longs相媲美。
一般来说,您应该使用Student implements Comparable<Student>
。从OO设计的角度来看,Student implements Comparable<Long>
没什么意义,因为我认为你想比较Student
个实例。
编辑:正如Jason在另一个答案中指出的那样,Student implements Comparable<Long>
也无法用Collections.sort()
使用,除非Student
以某种方式延长Long
。这是不可能的,因为Long
是最终的。
此外,使用Student implements Comparable<Student>
可以封装正在进行的精确比较。如果稍后,您决定更改id
的内部表示,或决定要使用其他字段,或使用多个字段实施二次比较,依此类推,那么{{1}的现有用户即使您更改了Student
实现,也不会中断类型。
由于上述原因,您很少会看到“野外”类型compareTo(Student student)
。 SomeType implements Comparable<SomeOtherType>
很可能与SomeType
的其他实例(即SomeType
)具有可比性。