Вызовите метод перегрузки «равно» для универсального типа - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь вызвать метод equals из универсального типа.Во время выполнения тип имеет перегрузку для «равно», но Object.equals (Object obj) все еще срабатывает.

Это универсальный класс, который вызывает «равно».

public class SortedGroup <T> {
    void func(T element1,T element2) {
        if (element1.equals(element2))
            System.out.println("yes");
        else
            System.out.println("no");
}

Это новый класс типов, который перегружает 'равно'

public class Person {
    private int ID;
    public Person(int ID) {
        this.ID = ID;
    }
...
    public boolean equals(Person o) {
        return (this.ID == o.ID);
    }
...
}

, и это главное.


Person p1 = new Person(1);
Person p2 = new Person(1);
SortedGroup<Person> SG = new SortedGroup<Person>();

SG.func(p1,p2);
}

Я ожидаю, что выход будет yes, но фактический вывод no

1 Ответ

4 голосов
/ 09 апреля 2019

Вы не переопределяете equals, вы перегружаете это (то же имя метода, другая подпись). Для корректного переопределения equals из Object необходимо соответствовать сигнатуре метода. Это означает, что ваш equals метод должен принимать Object, а не Person.

public boolean equals(Object o) {  // ...

Рекомендуется включать аннотацию @Override в любой метод, предназначенный для переопределения метода из суперкласса или реализации метода из интерфейса. Если бы вы сделали это, компилятор предупредил бы вас о том, что ваш метод не переопределил equals.

@Override
public boolean equals(Object o) {  // ...

Это также означает, что вам нужно проверить, является ли переданный объект на самом деле Person перед приведением и сравнением значений членов.

Рекомендуется также переопределить hashCode, чтобы оно соответствовало equals, согласно hashCode контракту .

...