В `равно (значение T) " должно ли T быть объектом, или оно может быть подобно городу и т. д.?


Я пытаюсь лучше понять Метод 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 2

3 ответа:

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

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

Сопутствующие вопросы:

Вы можете иметь и то и другое: (см. комментарий пока выше)

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 ().