重写equals()vs overriding compareTo()

时间:2015-03-26 15:38:43

标签: java override equals comparable

为什么我们必须在重写equals()方法时使用 Object 类型的参数,但是当我们覆盖compareTo()时,我们可以采用我们正在排序的类型的参数

   class Student implements Comparable { 
       String name; 
       int rollNum;
       // We can take here actual Student rather than Object
       public int compareTo(Object o){ 
           Student s = (Student)o; 
           return name.compareTo(o.getName());
       } 
       // We cant take an argument other than Object here
       public boolean equals(Object o){
       }
}

2 个答案:

答案 0 :(得分:2)

equals方法来自Object类,它由Java 1.0以来的所有对象扩展。然后没有泛型,Comparable接口主要用于这种方式,其中类本身是参数化的,例如:

class Student implements Comparable <Student> {
    ....

答案 1 :(得分:0)

致电foo.equals(bar)询问,“您认为自己是否等同于此引用所标识的对象?”相比之下,foo.compareTo(bar)询问“您是否应该支持此引用所标识的对象之上或之下?”

任何类型的对象都应该能够在给出任何类型的引用时回答第一个问题。如果Cat的实例被赋予对FordPickupTruck的引用并询问它是否相等,那么除了FordPickupTruck类或其任何实例之外,它不需要知道任何事情。事实上,一个实例不是Cat的实例,要知道它不等于给定引用标识的对象。

相比之下,第二个问题通常仅在比较相同类型的对象时才有意义。 CalendarEvent类可以定义CompareTo,以便已发生或将更快发生的事件将在以后的事件之前排序,而Person类可能会定义CompareTo以便人们排名按字母顺序排列。虽然Person对象可以毫无困难地确定它是否等同于特定的CalendarEvent对象(它只是简单地回答),但它可能没有任何有意义的方式可以说是否应在此类对象之前或之后进行排序。