Относительно переопределения метода равных в Java - PullRequest
4 голосов
/ 19 октября 2011

Я пытался переопределить методы equals и hashcode в классе. Это подкласс другого класса, который не реализует метод equals и методы hashCode.

Затмение дало следующее предупреждение.

  The super class ABC does not implement equals() and hashCode() methods.
  The resulting code may not work correctly. 

Почему дается указанное выше предупреждение? При каких обстоятельствах он может работать некорректно?

Ответы [ 2 ]

5 голосов
/ 19 октября 2011

Если вы скажете a.equals(b) против b.equals(a), разумно ожидать, что поведение будет таким же.Но если они относятся к соответствующим типам B и A, связанным наследованием, и только один из них правильно реализует equals, то поведение в этих двух примерах будет отличаться.

Здесь A - этосуперкласс и вообще не реализует equals (поэтому он наследует java.lang.Object.equals).Подкласс B переопределяет equals в зависимости от поля name.

class A {

  String name;

  public A() {
    this.name = "Fred";
  }

}

class B extends A {

  public boolean equals(Object o) {
    A a = (A)o;
    return a != null && a.name.equals(this.name);
  }
}

public class Test {

  public static void main(String[] args) {

    A a = new A();
    B b = new B();

    System.out.println(a.equals(b) == b.equals(a));
  }
} 

Неудивительно, что на выходе получается false, поэтому нарушает симметрию .

0 голосов
/ 26 апреля 2013

Вы пробовали переопределить суперкласс равными ... и затем автоматически сгенерировать реализацию переопределения подкласса ...

Я уверен, что это будет иначе.он будет вызывать super.equals ()

в текущей автоматически сгенерированной реализации, он только проверяет значения в дочернем классе.

Рассмотрим сценарий ниже, и вы поймете, почему предупреждение.

abstract Class A{
 private int a;
public void setA(int a){
this.a=a;
}
}

Class B extends A{
 private int x;
public void setX(int x){
this.x=x;
}

@Override
public boolean equals(Object obj) { // This does not call Super.equals
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    B other = (B) obj;
    if (x != other.x)
        return false;
    return true;
}

}

и в основном методе попробуйте

B b1= new B();
b1.setA(10);
b1.setX(20);


B b2= new B();
b2.setA(20);
b2.setX(20);

if(b1.equals(b2)){
 System.out.println("Warning was Right");
}
...