Мы знаем, что мы должны переопределить hashCode
, если мы переопределим equals
. Однако он компилируется, если я только переопределяю equals
. Это лучше или почему компилятор не делает предупреждение или подобное?Почему я могу скомпилировать неправильный код?
ответ
Составители в целом не применяют семантические ограничения.
В данном конкретном случае компилятор не может обеспечить надежный предупреждение - что, если вы знаете, что базовый класс hashCode
работает для производного класса? Или, если вам действительно нужно только equals
?
Благодарим вас за ответ. Я этого не знал. –
Вы можете установить компилятор для рассмотрения этого сценария как ошибки, если хотите.
IntelliJ
Настройки> Редактор> Обследования> Java> Возможные ошибки> равна() и хэш-код() не парные
описание есть,
Эта проверка отчетов классы, которые переопределяют метод equals(), но не переопределяют метод hashCode() или наоборот, что потенциально может привести к проблемам при добавлении класса в коллекцию.
Включить проверку и установить ее степень серьезности на Ошибка.
Затмение
Настройки> 'равно()' Java> Compiler>/Ошибки предупреждения> Потенциальные проблемы в программировании> Заменяет класса, но не 'хэш-код()'
Очень хорошо! Спасибо, что дали мне знать. –
Определение _должны_. Вы ожидаете, что компилятор сделает всю вашу проверку ошибок для вас? Когда это закончится? –
@SotiriosDelimanolis Я полагаю, это зависит от компьютера, если это 64 бит или какая-то другая длина. –
@DacSaunders, то, что компилятор java компилирует и не компилирует, указан в Спецификации языка Java (JLS). JLS не говорит, что вы * должны * переопределять 'hashCode' всякий раз, когда вы переопределяете' equals'. Это указано в API (в частности, javadoc «Object»). Вы могли бы также сказать, что вы никогда не должны делать 'while (true) {}', потому что ваша программа выйдет из строя. Тем не менее, компилятор, очевидно, скомпилирует его для вас. – aioobe