Cómo anular el método igual en Java

Resuelto asked hace 13 años • 11 respuestas

Estoy intentando anular el método igual en Java. Tengo una clase Peopleque básicamente tiene 2 campos de datos namey age. Ahora quiero anular equalsel 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.

 avatar Nov 18 '11 16:11
Aceptado
//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)

Kim avatar Nov 18 '2011 10:11 Kim

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í Peoplees 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 @Overrideanotació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.

fortran avatar Nov 18 '2011 09:11 fortran

No estoy seguro de los detalles ya que no has publicado el código completo, pero:

  • recuerda anular hashCode()también
  • el equalsmétodo debería tener Object, no Peoplecomo 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 instanceofpara comprobar que es un objeto 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 int(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.

Adrian Mouat avatar Nov 18 '2011 09:11 Adrian Mouat