В `equals (T value)`, T должен быть Object, или это может быть как City и т. Д.? - PullRequest
2 голосов
/ 17 июля 2010

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

6 голосов
/ 17 июля 2010

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

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

вопросы:

1 голос
/ 17 июля 2010

вы можете иметь оба: (см. Комментарий 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());
    }
}
0 голосов
/ 17 июля 2010

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

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

...