Что я делаю не так?
Вы не переопределяете. Вы перегружены.
Метод contains
вызывает метод equals
с подписью equals(Object)
, поэтому добавленный вами (новый) метод вызываться не будет.
Другая проблема заключается в том, что ваш метод equals
имеет неверную семантику для contains
. Метод contains
должен сравнивать this
с объектом, который может быть членом списка. Ваш список не содержит Long
объектов. Содержит объекты типа A
.
Теперь вам может это сойти с рук ... если вы используете необработанные типы списков ... но то, что вы пытаетесь сделать, это нарушение контракта API и плохая практика. Лучшее решение - явно итерировать и проверять элементы списка.
И мне тоже переопределить метод hashcode ()?
Если вы переопределяете equals(Object)
, вам также следует переопределить hashcode()
.
Здесь не будет никакой разницы, но важно, если вы когда-нибудь поместите свои A
объекты в хешированные структуры данных. И поскольку вы не знаете, что следующий парень собирается делать с вашим кодом, рекомендуется убедиться, что equals(Object)
и hashCode()
имеют совместимую семантику.