Допустим некто разработал класс А и реализовал для него следующий метод equals:
public boolean equals(Object arg) {
if (this == arg)
return true;
if(!(arg instanceof A))
return false;
return [сравниваем поля класса A]
}
Кто-то другой создал класс B, который наследуется от A и реализовал для него аналогичный метод equals.
И теперь у нас может возникнуть ситуация, когда a.equals(b) == true, потому что подмножество полей класса A совпадает у обоих объектов, а hashCode обоих объектов будет разным.
При противоположном сравнении b.equals(a) всегда будет ложь, потому что это объекты разных типов. Т.е. у нас нарушается симметричность метода equals.