Это потому, что ваш equals()
не является симметричным :
new Foo("ID1").equals("ID1");
, но
"ID1".equals(new Foo("ID1"));
не соответствует действительности.Это нарушает контракт equals()
:
Метод equals реализует отношение эквивалентности для ненулевых ссылок на объекты:
Это не Возврат либо:
- Это рефлексивно :. для любого ненулевого опорного значения
x
x.equals(x)
должна вернуть истинный * * * 1046 1047
1049
@ mbockus обеспечиваетправильная реализация equals()
:
public boolean equals(Object o){
if(o instanceof Foo){
Foo toCompare = (Foo) o;
return this.id.equals(toCompare.id);
}
return false;
}
, но теперь вы должны передать экземпляр Foo
в contains()
:
System.out.println(fooList.contains(new Foo("ID1")));
System.out.println(fooList.contains(new Foo("ID2")));
System.out.println(fooList.contains(new Foo("ID5")));
Наконец, вы должны реализовать hashCode()
для обеспечения согласованностирезультаты (если два объекта равны равны , они должны иметь равные hashCode()
):
@Override
public int hashCode() {
return id.hashCode();
}