Основные проблемы метода равных

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

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 будет возвращен; проверка числителей фактически игнорируется.

Другие вопросы по тегам