Какова причина решения включить эти методы в java.lang.Object? Равенство и хеширование не имеют смысла для многих классов.
Было бы логичнее создать два интерфейса:
interface Equalable {
boolean equals(Equalable other);
}
interface Hashable extends Equalable {
int hashCode();
}
Например, определение HashSet может выглядеть как
class HashSet<T extends Hashable> ...
Это предотвратит одну из распространенных ошибок новичков - использование набора элементов без реализации equals / hashCode.