Encuesta: Comportamiento correcto de la igualdad cuando pasa objeto no coincide con el tipo LHS?

StackOverflow https://stackoverflow.com/questions/364478

Pregunta

he hecho una pregunta relacionada sobre findbugs, pero vamos a hacer una pregunta más general.

Supongamos que estoy trabajando con un lenguaje orientado a objetos en los que el polimorfismo es posible.

Supongamos que el lenguaje soporta la comprobación de tipo estático (por ejemplo, Java, C ++)

Supongamos que el idioma no permite la variación en los parámetros (por ejemplo, Java, otra vez ...)

Si estoy anulando la operación de la igualdad, que toma objeto como un parámetro, lo que debería hacer en una situación en la que el parámetro no es el mismo tipo o un subtipo como el LHS que iguala había sido llamado?

Opción 1 - return false porque los objetos no son claramente iguales

Opción 2 - Lanza una excepción de fundición porque si la lengua apoyada en realidad varianza (que habría sido preferible), esto habría sido capturado en tiempo de compilación como un error; Por lo tanto, la detección de este error en tiempo de ejecución tiene sentido ya que una situación en la que otro tipo se envía debería haber sido ilegal.

¿Fue útil?

Solución

Yo voto por la opción 1. Es posible para dos objetos de diferentes tipos para ser iguales - por ejemplo, int y doble, si los objetos de primera clase, validily puede ser fundido como entre sí y son comparables matemáticamente. Además, es posible que desee considerar diferentes subclases iguales en algunos aspectos, sin embargo, ni puede ser capaz de ser echado a la otra (a pesar de que se pueden derivar de la misma matriz).

Otros consejos

Vuelta falsa, porque los objetos no son iguales.

No veo cómo lanzar una ClassCastException sería mejor aquí.

Hay contratos de interfaces como Collection o List que realmente dependen de cualquier objeto de poder comprobar la igualdad con cualquier otro objeto.

Depende.

SomeClass obj1 = new SomeClass();
object other = (object)obj1;

return obj1.Equals(other); // should return "true", since they are really the same reference.

SomeClass obj1 = new SomeClass();
object other = new object();

return obj1.Equals(other); // should return "false", because they're different reference objects.

class SomeClass { }
class OtherClass { }

SomeClass obj1 = new SomeClass();
OtherClass obj2 = new OtherClass();

return obj1.Equals(obj2); // should return "false", because they're different reference objects.

Si los tipos son dos tipos completamente diferentes que no heredan el uno del otro, entonces no hay manera posible que puede ser la misma referencia.

No debe ser tirar cualquier tipo de excepción de fundición porque estás aceptando la clase de objeto de base como parámetro.

Hmmm .. me gusta la opción 1, así, por las siguientes razones 4:

1) Los objetos eran aparentemente no es igual por cualquier condición que utilizó para comprobar

2) Lanzar ClassCastException requiere un cheque por esa excepción cada vez que haces una comparación, y creo que contribuye al código que es menos comprensible, o al menos ya ...

3) La excepción fundido clase es simplemente un síntoma del problema, que es que los dos objetos no eran iguales, incluso en el nivel de tipo.

4) como usuario "CBO" mencionado anteriormente, doble / INT siendo igual a pesar de sus tipos son diferentes (4,0 == 4) y esto se aplica a otros tipos también.

exención de responsabilidad: me puede dejar que mis maneras Python colorear un debate Java:)

Dr. Dobb de Java Q y A dice que la mejor práctica es que ambos son del mismo tipo. Así que yo voto la opción 1.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top