Estoy tratando de anular el método de igualdad en Java. Tengo una clase Peopleque básicamente tiene 2 campos de datos namey age. Ahora quiero anular el equalsmé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 * hashqué lo estás usando?getClass()causará problemas si la clase se subclasifica y se compara con un objeto de la superclase.hashCode()instanceofoperador oisAssignableFrom. Esto requerirá una coincidencia de tipo exacta, en lugar de una coincidencia de subtipo. - Requisito simétrico. También para compararStringu 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í
Peoplees diferente aObject.Cuando la firma de un método sigue siendo idéntica a la de su superclase, se denomina anulación y la
@Overrideanotació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énequalsmétodo debería tenerObject, noPeoplecomo 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.instanceofpara comprobar si es un objeto de personas, por ejemploif (!(other instanceof People)) { result = false;}equalsse 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
equalsmé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
xyy,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)vuelvetrueyy.equals(z)vuelvetrue, entoncesx.equals(z)debe devolvertrue.Consistente: para cualquier valor de referencia no nulo
xyy, múltiples invocaciones dex.equals(y)deben regresartrueo 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
instanceofoperador 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
floatodouble, use el==operador para comparaciones; para campos de referencia de objeto, llame alequalsmétodo de forma recursiva; para losfloatcampos, use elFloat.compare(float, float)método estático ; y paradoublecampos, useDouble.compare(double, double). El tratamiento especial de los campos flotantes y dobles se hace necesario por la existencia deFloat.NaN,-0.0fy los valores dobles análogos; Si bien podría comparar los camposfloatydoublecon los métodos estáticosFloat.equalsyDouble.equals, esto implicaría un ajuste automático en cada comparación, lo que tendría un rendimiento deficiente. Para losarraycampos, aplique estas pautas a cada elemento. Si todos los elementos de un campo de matriz son significativos, utilice uno de losArrays.equalsmé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
agees de tipoint:fuente
NullPointerExceptionifnameisnull.namenunca se le asigna unnullvalor ...Al comparar objetos en Java, realiza una verificación semántica , comparando el tipo y el estado de identificación de los objetos con:
nullReglas:
a.equals(b) == b.equals(a)equals()siempre cedetrueofalse, pero nunca unNullpointerException,ClassCastExceptiono cualquier otro arrojableComparación:
instanceofpara 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
Personclase:Clase de utilidad genérica reutilizable:
Para su
Personclase, 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