Логически мы имеем:
a.getClass().equals(b.getClass()) && a.equals(b) ⇒ a.hashCode() == b.hashCode()
a.getClass().equals(b.getClass()) && a.equals(b)
a.hashCode() == b.hashCode()
Но не наоборот!