Основные проблемы метода равных
Я пытаюсь создать класс рациональных чисел и переопределить методы равенства и хэш-кода. Но мое равенство возвращается в случаях, когда это явно не соответствует действительности, то есть числитель и знаменатель различны. Есть идеи, что может быть причиной этого?
public boolean equals(Object rhs) {
if (this == rhs){
return true;
}
if (rhs == null){
return false;
}
if (!(rhs instanceof Rational)){
return false;
}
Rational other = (Rational) rhs;
if (denom == other.denom){
if (num == other.num);{
return true;
}
}
return false;
}
3 ответа
Вот проблема (если не опечатка):
if (num == other.num);{
Точка с запятой означает, что if
оператор является пустым оператором, поэтому его оценка на самом деле не участвует в процессе проверки на равенство. Просто удалите точку с запятой:
if (num == other.num){
Удалить ;
после if (num == other.num); {
Измени это if (num == other.num) {
Оставив его там, он практически ничего не делает после if
, затем входит в блок:
{
return true;
}
Так что он всегда вернет истину в этой точке.
Удалите точку с запятой в этой строке, которая выступает в качестве тела для if
заявление.
if (num == other.num);{
С точкой с запятой, если знаменатели равны, то true
будет возвращен; проверка числителей фактически игнорируется.