Estoy tratando de anular el método de igualdad en Java. Tengo una clase People
que básicamente tiene 2 campos de datos name
y age
. Ahora quiero anular el equals
método para poder verificar entre 2 objetos People.
Mi código es el siguiente
public boolean equals(People other){
boolean result;
if((other == null) || (getClass() != other.getClass())){
result = false;
} // end if
else{
People otherPeople = (People)other;
result = name.equals(other.name) && age.equals(other.age);
} // end else
return result;
} // end equals
Pero cuando escribo age.equals(other.age)
, me da un error, ya que el método igual solo puede comparar String y la edad es Integer.
Solución
solía ==
operador como se sugirió y mi problema está resuelto.
java
overriding
equals
castor
fuente
fuente
Respuestas:
Salida:
fuente
hash = 53 * hash
qué lo estás usando?getClass()
causará problemas si la clase se subclasifica y se compara con un objeto de la superclase.hashCode()
instanceof
operador oisAssignableFrom
. Esto requerirá una coincidencia de tipo exacta, en lugar de una coincidencia de subtipo. - Requisito simétrico. También para compararString
u otros tipos de objetos, puede usarObjects.equals(this.name,other.name)
.La introducción de una nueva firma de método que cambia los tipos de parámetros se denomina sobrecarga :
Aquí
People
es diferente aObject
.Cuando la firma de un método sigue siendo idéntica a la de su superclase, se denomina anulación y la
@Override
anotación ayuda a distinguir los dos en tiempo de compilación:Sin ver la declaración real de
age
, es difícil decir por qué aparece el error.fuente
No estoy seguro de los detalles ya que no ha publicado el código completo, pero:
hashCode()
tambiénequals
método debería tenerObject
, noPeople
como su tipo de argumento. En este momento, está sobrecargando, no anulando, el método equals, que probablemente no sea lo que desea, especialmente dado que verifica su tipo más tarde.instanceof
para comprobar si es un objeto de personas, por ejemploif (!(other instanceof People)) { result = false;}
equals
se utiliza para todos los objetos, pero no para los primitivos. Creo que quieres decir que la edad es unint
(primitivo), en cuyo caso solo usa==
. Tenga en cuenta que un entero (con una 'I' mayúscula) es un objeto que debe compararse con iguales.Consulte ¿Qué problemas deben tenerse en cuenta al anular equals y hashCode en Java? para más detalles.
fuente
fuente
Ítem 10: Obedezca el contrato general cuando prevalezca igual
Cada instancia de la clase es inherentemente única . Esto es cierto para clases como Thread que representan entidades activas en lugar de valores. La implementación igual proporcionada por Object tiene exactamente el comportamiento correcto para estas clases.
No es necesario que la clase proporcione una prueba de "igualdad lógica". Por ejemplo, java.util.regex.Pattern podría haber anulado los iguales para verificar si dos instancias de Pattern representaban exactamente la misma expresión regular, pero los diseñadores no pensaron que los clientes necesitarían o querrían esta funcionalidad. En estas circunstancias, la implementación de iguales heredada de Object es ideal.
Una superclase ya ha anulado los iguales y el comportamiento de la superclase es apropiado para esta clase. Por ejemplo, la mayoría de las implementaciones de Set heredan su implementación igual de AbstractSet, las implementaciones de List de AbstractList y las implementaciones de Map de AbstractMap.
La clase es privada o privada de paquete , y usted está seguro de que su método equals nunca será invocado. Si es extremadamente reacio al riesgo, puede anular el método equals para asegurarse de que no se invoque accidentalmente:
El
equals
método implementa una relación de equivalencia. Tiene estas propiedades:Reflexivo: para cualquier valor de referencia no nulo
x
,x.equals(x)
debe devolver verdadero.Simétrico: para cualquier valor de referencia no nulo
x
yy
,x.equals(y)
debe devolver verdadero si y solo si y.equals (x) devuelve verdadero.Transitiva: Para cualquier valor de referencia que no son nulos
x
,y
,z
, six.equals(y)
vuelvetrue
yy.equals(z)
vuelvetrue
, entoncesx.equals(z)
debe devolvertrue
.Consistente: para cualquier valor de referencia no nulo
x
yy
, múltiples invocaciones dex.equals(y)
deben regresartrue
o regresar consistentementefalse
, siempre que no se modifique la información utilizada en comparaciones iguales.Para cualquier valor de referencia no nulo
x
,x.equals(null)
debe regresarfalse
.Aquí hay una receta para un método igual de alta calidad:
Utilice el
==
operador para comprobar si el argumento es una referencia a este objeto. Si es así, devuelve verdadero. Esta es solo una optimización del rendimiento, pero vale la pena hacerla si la comparación es potencialmente costosa.Utilice el
instanceof
operador para comprobar si el argumento es del tipo correcto. Si no, devuelve falso. Normalmente, el tipo correcto es la clase en la que se produce el método. Ocasionalmente, es alguna interfaz implementada por esta clase. Utilice una interfaz si la clase implementa una interfaz que refina el contrato de iguales para permitir comparaciones entre las clases que implementan la interfaz. Las interfaces de colección como Set, List, Map y Map.Entry tienen esta propiedad.Transmita el argumento al tipo correcto. Debido a que este lanzamiento fue precedido por una instancia de prueba, se garantiza que tendrá éxito.
Para cada campo "significativo" de la clase, compruebe si ese campo del argumento coincide con el campo correspondiente de este objeto. Si todas estas pruebas tienen éxito, devuelve verdadero; de lo contrario, devuelve falso. Si el tipo en el Paso 2 es una interfaz, debe acceder a los campos del argumento a través de métodos de interfaz; si el tipo es una clase, es posible que pueda acceder a los campos directamente, según su accesibilidad.
Para campos primitivos cuyo tipo no es
float
odouble
, use el==
operador para comparaciones; para campos de referencia de objeto, llame alequals
método de forma recursiva; para losfloat
campos, use elFloat.compare(float, float)
método estático ; y paradouble
campos, useDouble.compare(double, double)
. El tratamiento especial de los campos flotantes y dobles se hace necesario por la existencia deFloat.NaN
,-0.0f
y los valores dobles análogos; Si bien podría comparar los camposfloat
ydouble
con los métodos estáticosFloat.equals
yDouble.equals
, esto implicaría un ajuste automático en cada comparación, lo que tendría un rendimiento deficiente. Para losarray
campos, aplique estas pautas a cada elemento. Si todos los elementos de un campo de matriz son significativos, utilice uno de losArrays.equals
métodos.Algunos campos de referencia de objetos pueden contener legítimamente
null
. Para evitar la posibilidad de aNullPointerException
, verifique la igualdad de dichos campos utilizando el método estáticoObjects.equals(Object, Object)
.fuente
hashCode()
. Nota también, que desde la escritura Java7equals()
yhashCode()
métodos se ha vuelto mucho más fácil mediante el usoObjects.equals()
,Arrays.equals()
yObjects.hashCode()
,Arrays.hashCode()
.if (getClass() != obj.getClass()) ...
lugar de usar el operador instanceof. Esto requerirá una coincidencia de tipo exacta , en lugar de una coincidencia de subtipo. - Requisito simétrico.Como supongo que
age
es de tipoint
:fuente
NullPointerException
ifname
isnull
.name
nunca se le asigna unnull
valor ...Al comparar objetos en Java, realiza una verificación semántica , comparando el tipo y el estado de identificación de los objetos con:
null
Reglas:
a.equals(b) == b.equals(a)
equals()
siempre cedetrue
ofalse
, pero nunca unNullpointerException
,ClassCastException
o cualquier otro arrojableComparación:
instanceof
para la comparación de tipos (que solo funciona mientras no haya subclases y viola la regla de simetría cuandoA extends B -> a instanceof b != b instanceof a)
.Para tu
Person
clase:Clase de utilidad genérica reutilizable:
Para su
Person
clase, usando esta clase de utilidad:fuente
si age es int, debe usar == si es un objeto Integer, entonces puede usar equals (). También debe implementar el método hashcode si anula los iguales. Los detalles del contrato están disponibles en el javadoc de Object y también en varias páginas de la web.
fuente
Aquí está la solución que utilicé recientemente:
fuente