2015-03-26 4 views
0

Почему мы должны иметь аргумент типа Объект при переопределении метода equals(), но когда мы переопределяем compareTo(), мы можем принять аргумент типа, который мы сортируемoverriding equals() vs overriding 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){ 
     } 
} 
+4

Различные методы для разных целей. –

+0

Примечание для равных вам понадобится реализация hashCode! – StackFlowed

+0

@StackFlowed Не нужно «(говорит адвокат дьявола); хотя это не определено также, нарушает договор Объекта. – user2864740

ответ

2

equals метод исходит из Object класса, который продлевается на все объекты, так как Java 1.0. Тогда не было дженерики и Comparable интерфейс используется в основном путь, в котором класс параметризованное сам по себе, например:

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

Вызов foo.equals(bar) спрашивает: «Считаете ли вы себя эквивалент объекта, указанный в этой ссылке? " В отличие от этого, foo.compareTo(bar) спрашивает: «Должны ли вы поддерживаться выше или ниже объекта, указанного в этой ссылке?»

Любой объект должен иметь возможность ответить на первый вопрос, если ему заданы какие-либо ссылки. Если экземпляр Cat получил ссылку на FordPickupTruck и спросил, эквивалентен ли он, ему не нужно ничего знать о классе FordPickupTruck или о любых его случаях, кроме того, что экземпляр для одного не является экземпляром Cat, чтобы знать, что он не эквивалентен объекту, определенному данной ссылкой.

Второй вопрос, напротив, обычно имеет смысл при сравнении объектов одного и того же типа. Класс CalendarEvent может определять CompareTo так, что события, которые произошли или произойдут раньше, будут сортироваться до более поздних событий, тогда как класс Person может определить CompareTo, чтобы люди были ранжированы по алфавиту по имени. В то время как объект Person не имеет проблем с определением того, был ли он эквивалентен конкретному объекту CalendarEvent (он просто ответил бы отрицательным), вероятно, не было бы никакого значимого способа, с помощью которого он мог бы сказать, следует ли его сортировать до или после такой объект.