2015-04-19 3 views
1

Ниже приведен код, который я должен сделать для обеспечения безопасного анализа, найти ошибки, найденные в этом методе.Как исправить ошибку, найденную с помощью ошибок поиска

// Equals Method 
    public boolean equals(Date dateIn){ 
     if(day == dateIn.day && month == dateIn.month && year == dateIn.year) 
      return true; 
     else 
      return false; 
    } 

найти ошибки говорят: Этот класс определяет ковариантную версию равенства() метода, но наследует метод нормальных Equals (Object), определенный в классе базового java.lang.Object , Класс должен, вероятно, определить метод boolean equals (Object) .

Как избавиться от этой ошибки может кто-нибудь помочь?

+3

Ваш 'equals' метод не является действительным. Это должно быть 'boolean equals (Object o)'. –

+0

@BoristheSpider О, это действительный метод, он просто не переопределяет тот объект в Object. – immibis

+0

@immibis, если вы педантичны, да. Но это не действительный метод _'equals'_, так как (по крайней мере, на мой взгляд) всегда ссылается на тот, который находится на 'Object'. –

ответ

4

equals() должен принимать Object как аргумент, чтобы соответствовать супер-методу, который он переопределяет. Используйте аннотацию @Override, чтобы обеспечить ее соблюдение.

// Equals Method 
@Override 
public boolean equals(Object o){ 
    if (!(o instanceof Date)) 
     return false; 
    Date dateIn = (Date) o; 
    if(day == dateIn.day && month == dateIn.month && year == dateIn.year) 
     return true; 
    else 
     return false; 
} 
2

Если Date класс некоторые пользовательские Date класс, который вы написали, вы должны изменить свой метод equals переопределить Object ровней:

@Override 
public boolean equals(Object other) 
{ 
    if (this == other) 
     return true; 
    if (!(other instanceof Date)) 
     return false; 
    Date dateIn = (Date) other; 
    if(day == dateIn.day && month == dateIn.month && year == dateIn.year) 
     return true; 
    else 
     return false; 
} 

В противном случае он не будет использоваться должным образом (с коллекций, таких как HashMap, HashSet, ArrayList и т. Д. Вызовет реализацию по умолчанию Objectequals вместо вызова вашей реализации).

4

Вы перегружаете метод equals(). Это означает, что есть две фактические функции, которые можно назвать. А именно, унаследованные equals(Object) и ваши equals(Date).

Перегрузка означает, что существует несколько методов с именем же но различных типов аргументов.

Переопределение означает, что вы меняете реализации метода, который определен в родительском классе (класс вы наследующий). Если вы не наследуете напрямую от другого класса, вы по умолчанию наследуете функции от Object (например, в этом случае equals(Object)).

@Override аннотация содержит проверки и ошибки времени компиляции, если нет такого метода для перезаписи. Это произошло бы в вашем случае (так как вы перегрузили и не переопределили).

Изменить код

// Equals Method 
@Override 
public boolean equals(Object object) { 
    if(this == object) return true; 
    if(!(object instanceof Date)) return false; 

    Date dateIn = (Date) object;  
    if(day == dateIn.day && month == dateIn.month && year == dateIn.year) 
     return true; 
    else 
     return false; 
} 
+0

Я отредактировал ваш ответ, обратите внимание, что перегрузка! = Переопределение. – Maroun

+0

Ну, на самом деле он перегрузил функцию, когда он ввел '' 'equals (Date)' ''. – lschuetze

+0

Будет здорово, если вы сможете объяснить разницу между ними, похоже, что это поможет OP понять его ошибку. – Maroun

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