Java 通过将模型类的实例传递给comparable和将包装器传递给comparable之间有什么区别?
假设我有一个具有属性name和id的Student类,我想使用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
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
extendedLong
。这是不可能的,因为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
extendedLong
。这是不可能的,因为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的有效替代品感谢我的编辑,愚蠢的错误@杰森:谢谢你的编辑,我犯了个愚蠢的错误!