Cómo anular el método igual en Java
Estoy intentando anular el método igual en Java. Tengo una clase People
que básicamente tiene 2 campos de datos name
y age
. Ahora quiero anular equals
el método para poder verificar entre 2 objetos de personas.
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 cadenas y la edad es entera.
Solución
Utilicé ==
el operador como se sugirió y mi problema está resuelto.
//Written by K@stackoverflow
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
ArrayList<Person> people = new ArrayList<Person>();
people.add(new Person("Subash Adhikari", 28));
people.add(new Person("K", 28));
people.add(new Person("StackOverflow", 4));
people.add(new Person("Subash Adhikari", 28));
for (int i = 0; i < people.size() - 1; i++) {
for (int y = i + 1; y <= people.size() - 1; y++) {
boolean check = people.get(i).equals(people.get(y));
System.out.println("-- " + people.get(i).getName() + " - VS - " + people.get(y).getName());
System.out.println(check);
}
}
}
}
//written by K@stackoverflow
public class Person {
private String name;
private int age;
public Person(String name, int age){
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (obj.getClass() != this.getClass()) {
return false;
}
final Person other = (Person) obj;
if ((this.name == null) ? (other.name != null) : !this.name.equals(other.name)) {
return false;
}
if (this.age != other.age) {
return false;
}
return true;
}
@Override
public int hashCode() {
int hash = 3;
hash = 53 * hash + (this.name != null ? this.name.hashCode() : 0);
hash = 53 * hash + this.age;
return hash;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Producción:
correr:
-- Subash Adhikari - VS - K falso
- Subash Adhikari - VS - StackOverflow falso
- Subash Adhikari - VS - Subash Adhikari verdadero
- K - VS - StackOverflow falso
- K - VS - Subash Adhikari falso
- StackOverflow - VS - Subash Adhikari falso
-- CONSTRUCCIÓN EXITOSA (tiempo total: 0 segundos)
La introducción de una nueva firma de método que cambia los tipos de parámetros se denomina sobrecarga :
public boolean equals(People other){
Aquí People
es diferente a Object
.
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:
@Override
public boolean equals(Object other){
Sin ver la declaración real de age
, es difícil decir por qué aparece el error.
No estoy seguro de los detalles ya que no has publicado el código completo, pero:
- recuerda anular
hashCode()
también - el
equals
método debería tenerObject
, noPeople
como tipo de argumento. En este momento estás sobrecargando, no anulando, el método igual, que probablemente no sea lo que deseas, especialmente teniendo en cuenta que comprobarás su tipo más adelante. - puedes usar
instanceof
para comprobar que es un objeto 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 esint
(primitiva), en cuyo caso simplemente usa==
. Tenga en cuenta que un número entero (con 'I' mayúscula) es un objeto que debe compararse con iguales.
Consulte ¿Qué cuestiones se deben tener en cuenta al anular iguales y hashCode en Java? para más detalles.