2017-01-19 3 views
1

Мы знаем, что мы должны переопределить hashCode, если мы переопределим equals. Однако он компилируется, если я только переопределяю equals. Это лучше или почему компилятор не делает предупреждение или подобное?Почему я могу скомпилировать неправильный код?

+1

Определение _должны_. Вы ожидаете, что компилятор сделает всю вашу проверку ошибок для вас? Когда это закончится? –

+0

@SotiriosDelimanolis Я полагаю, это зависит от компьютера, если это 64 бит или какая-то другая длина. –

+0

@DacSaunders, то, что компилятор java компилирует и не компилирует, указан в Спецификации языка Java (JLS). JLS не говорит, что вы * должны * переопределять 'hashCode' всякий раз, когда вы переопределяете' equals'. Это указано в API (в частности, javadoc «Object»). Вы могли бы также сказать, что вы никогда не должны делать 'while (true) {}', потому что ваша программа выйдет из строя. Тем не менее, компилятор, очевидно, скомпилирует его для вас. – aioobe

ответ

1

Составители в целом не применяют семантические ограничения.

В данном конкретном случае компилятор не может обеспечить надежный предупреждение - что, если вы знаете, что базовый класс hashCode работает для производного класса? Или, если вам действительно нужно только equals?

+0

Благодарим вас за ответ. Я этого не знал. –

1

Вы можете установить компилятор для рассмотрения этого сценария как ошибки, если хотите.

IntelliJ

Настройки> Редактор> Обследования> Java> Возможные ошибки> равна() и хэш-код() не парные

описание есть,

Эта проверка отчетов классы, которые переопределяют метод equals(), но не переопределяют метод hashCode() или наоборот, что потенциально может привести к проблемам при добавлении класса в коллекцию.

Включить проверку и установить ее степень серьезности на Ошибка.

Затмение

Настройки> 'равно()' Java> Compiler>/Ошибки предупреждения> Потенциальные проблемы в программировании> Заменяет класса, но не 'хэш-код()'

+0

Очень хорошо! Спасибо, что дали мне знать. –

 Смежные вопросы

  • Нет связанных вопросов^_^