Я задал связанный вопрос о findbugs, но давайте зададим более общий вопрос.
Предположим, что я работаю с объектно-ориентированным языком, в котором возможен полиморфизм.
Предположим, что язык поддерживает статическую проверку типов (например, Java, C ++)
Предположим, что язык не допускает отклонения в параметрах (например, Java, снова ...)
Если я переопределяю операцию равенства, которая принимает Object в качестве параметра, что мне следует делать в ситуации, когда параметр не имеет тот же тип или подтип, что и LHS, к которому был обращен эквивалентный вызов?
Вариант 1 - вернуть false, поскольку объекты явно не равны
Вариант 2 - генерировать исключение приведения, потому что если бы язык действительно поддерживал дисперсию (что было бы предпочтительнее), это было бы воспринято во время компиляции как ошибка; таким образом, обнаружение этой ошибки во время выполнения имеет смысл, поскольку ситуация, когда отправляется другой тип, должна быть недопустимой.