В `equals(T value)`, T должен быть Object, или это может быть как City и т. Д.?

Я пытаюсь понять equals() метод лучше. Все примеры, которые я видел, делают что-то вроде:

public class City
{
    public boolean equals(Object other)
    {
        if (other instanceof City && other.getId().equals(this.id))
        {
            return true;
        }

        // ...
    }
}

Должен ли метод взять объект, а не город?

Например, это ниже не допускается?

public class City
{
    public boolean equals(City other)
    {
        if (other == null)
        {
            return false;
        }

        return this.id.equals(other.getId());
    }
}

3 ответа

Решение

Да, это должно быть Object, Иначе ты не переопределяешь реальное Object#equals() Скорее перегружает его.

Если вы только перегружаете его, то он не будет использоваться стандартными API, такими как Collection API и т. Д.

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

Вы можете иметь оба: (см. комментарий poke выше)

public class City
{
    public boolean equals(Object other)
    {
        return (other instanceof City) && equals((City)other) ;
    }
    public boolean equals(City other)
    {
        return other!=null && this.id.equals(other.getId());
    }
}

Не берите ничего, кроме Object если вы хотите переопределить equals()!

Написание специализированного метода equals () является распространенной ошибкой, но имеет тенденцию нарушать контракт equals ().

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