2014-12-16 3 views
1

У меня есть два класса Person и Teacher. В классе Person я проверяю, равны ли эти два объекта, используя метод compareTo. В классе Teacher проблема, над которой я работаю, утверждает, что мне нужно переопределить метод equals в Person. В этом методе equals единственным способом, который он вернет, является то, что он равен как методу equals в Person, так и Teacher. Мой вопрос заключается в том, когда я регистрирую Teacher метод equals, просто позвоню super.equals(other), чтобы проверить, равны ли два объекта родительскому классу или что-то еще мне нужно сделать?Java overriding parent равно метод

лицо:

public class Person implements Comparable<Person> { 


    public boolean equals(Object other) { 
     try { 
      return this.compareTo(other) == 0; 
     }catch(Exception e) { 
      return false; 
     } 
    } 
} 

Учитель

public class Teacher extends Person { 
    private String facultyID; 
    @Override 
    public boolean equals(Object other) { 
     boolean personEquals = super.equals(other); 
     try { 
      Teacher teach1 = (Teacher)other; 
      boolean idEquals = this.facultyID.equals(teach1.facultyID); 
      if(idEquals && personEquals) 
       return true; 
      return false; 
     }catch(Exception e) { 
      return false; 
     } 
    } 
} 
+0

'this.compareTo (other)' не возвращает 'boolean'. Это должно читать 'this.compareTo (другое) == 0'. –

+3

Будьте очень осторожны в отношении двух конкурирующих реализаций 'equals'. Это приводит к несимметричному равенству. – khelwood

+0

@CostiCiudatu Спасибо за улов! Я отредактировал код, чтобы изменить это. – Andrew

ответ

1

В принципе, договор Object#equals состояний:

Он симметричен: для любых ненулевых значений ссылок х и у, x.equals (y) должно возвращать истинное тогда и только тогда, когда y.equals (x) возвращает true

И реализация Teacher#equals не соответствует этому требованию. В случае применения метода equals в классе, который наследует от другого, который не является Object, например. Teacher, вы должны проверить, соответствует ли тип объекта, который нужно сравнить, так же, как и класс, который вы сравниваете. Для достижения этой цели, вы должны использовать getClass().equals:

public class Teacher extends Person { 
    private String facultyID; 
    @Override 
    public boolean equals(Object other) { 
     //this line is nonsense, not all Persons are Teachers 
     //boolean personEquals = super.equals(other); 

     //avoid using try-catch 
     //try { 

     //verify that the other object is not null 
     if (other == null) { 
      return false; 
     } 

     //verify that the other object is specifically a Teacher, not a super or a subclass of it 
     if (this.getClass().equals(other.getClass()) { 
      //here comes the real check 
      Teacher otherTeacher = (Teacher)other; 
      return this.facultyID.equals(otherTeacher.facultyID); 
     } 
     return false; 
    } 
} 

ли похожи на Person в случае, если она не должна допускать сравнения с подклассов его.

Смежные вопросы