I asked a related question about findbugs, but let's ask a more general question.
Suppose that I am working with an object-oriented language in which polymorphism is possible.
Suppose that the language supports static type checking (e.g., Java, C++)
Suppose that the language does not allow variance in parameters (e.g., Java, again...)
If I am overriding the equality operation, which takes Object as a parameter, what should I do in a situation where the parameter is not the same type or a subtype as the LHS that equals had been called upon?
Option 1 - Return false because the objects are clearly not equals
Option 2 - Throw a casting exception because if the language actually supported variance (which would have been preferable), this would have been caught at compile time as an error; thus, detecting this error at runtime makes sense since a situation where another type is sent should have been illegal.