Java 通过将模型类的实例传递给comparable和将包装器传递给comparable之间有什么区别?

Java 通过将模型类的实例传递给comparable和将包装器传递给comparable之间有什么区别?,java,sorting,collections,comparable,Java,Sorting,Collections,Comparable,假设我有一个具有属性name和id的Student类,我想使用Collections.sort()方法按照学生各自id的自然顺序对学生的列表进行排序。我可以通过以下两种方式来实现: public class Student implements Comparable<Student> { private Long id; private String name; // getters and setters.. public int c

假设我有一个具有属性name和id的Student类,我想使用
Collections.sort()
方法按照学生各自id的自然顺序对学生的
列表进行排序。我可以通过以下两种方式来实现:

 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());
     }
 }
公共班级学生实施可比{
私人长id;
私有字符串名称;
//能手和二传手。。
公共国际比较(学生){
将这个.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);
    }
}
公共班级学生实施可比{
私人长id;
私有字符串名称;
//能手和二传手。。
公共整数比较(长id){
将此.getId().compareTo(id)返回;
}
}

然后使用
Collections.sort()
方法对学生列表进行排序。我的问题或困惑是,如果我们使用一种方法与另一种方法相比会有什么区别,因为它们都会产生相同的结果。

如果您实现
可比较的
集合.sort()
将无法在
列表中使用它,因为
集合.sort()
将无法计算从何处获取
Long
以传递到
compareTo(Long)
如果实现
Comparable
集合。sort()
将无法在
列表上使用它,因为
集合。sort()
将无法确定从何处获取
Long
以传递到
compareTo(Long)
Comparable的类型参数由您的类型可比较的对象类型决定。在前一个例子中,你让学生们相互比较,在后一个例子中,你让学生们与长辈们比较

一般来说,你应该使用
学生工具
<代码>学生实现可比较的
从OO设计的角度看没有什么意义,因为我假设您希望比较
学生
实例

编辑:正如Jason在另一个答案中指出的那样,
Student implements Compariable
也不能用于
Collections.sort()
,除非
Student
extended
Long
。这是不可能的,因为
Long
是最终的

此外,使用
Student implements Compariable
可以封装正在进行的精确比较。如果以后您决定更改
id
的内部表示形式,或者决定使用不同的字段,或者使用多个字段实现二次比较,等等,那么
Student
类型的现有用户即使将
compareTo(Student-Student)
实现更改为
compareTo(Student-Student)
也不会收支平衡


出于上述原因,您很少会看到类型“在野外”,其中
SomeType实现了可比较的
SomeType
很可能与
SomeType
的其他实例相比较(即
SomeType实现了Compariable
)。

Compariable的类型参数由您的类型可比较的对象类型决定。在前一个例子中,你让学生们相互比较,在后一个例子中,你让学生们与长辈们比较

一般来说,你应该使用
学生工具
<代码>学生实现可比较的
从OO设计的角度看没有什么意义,因为我假设您希望比较
学生
实例

编辑:正如Jason在另一个答案中指出的那样,
Student implements Compariable
也不能用于
Collections.sort()
,除非
Student
extended
Long
。这是不可能的,因为
Long
是最终的

此外,使用
Student implements Compariable
可以封装正在进行的精确比较。如果以后您决定更改
id
的内部表示形式,或者决定使用不同的字段,或者使用多个字段实现二次比较,等等,那么
Student
类型的现有用户即使将
compareTo(Student-Student)
实现更改为
compareTo(Student-Student)
也不会收支平衡


出于上述原因,您很少会看到类型“在野外”,其中
SomeType实现了可比较的
SomeType
很可能与其他
SomeType
(即
SomeType实现Compariable
)的实例相比较。

当您说“它们都产生相同的结果”时,是否使用了
Collections.sort()
?请向我们展示您的测试代码。@Jason我测试了我的代码,发现第二种方法在编译时不起作用。当您说“它们都产生相同的结果”时,它给出了推断类型Student不是有界参数的有效替代品,您是否使用了
Collections.sort()
?请向我们展示您的测试代码。@Jason我测试了我的代码,发现第二种方法在编译时不起作用。它给出了推断类型Student不是有界参数@Jason的有效替代品感谢我的编辑,愚蠢的错误@杰森:谢谢你的编辑,我犯了个愚蠢的错误!