通过将我们的模型类的实例传递给可比较的并且将包装器传递给可比较的,使用可比较的区别是什么?

时间:2014-11-10 03:48:39

标签: java sorting collections comparable

假设我有一个带有属性名称和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()方法对学生列表进行排序。我的问题或困惑是,如果我们使用一个而不是其他产生相同的结果,它会产生什么差异。

2 个答案:

答案 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)具有可比性。