2011-10-19 18 views
4

クラス内でequalsメソッドとhashcodeメソッドをオーバーライドしようとしました。 equalsメソッドとhashCodeメソッドを実装していない別のクラスのサブクラスです。Javaのequalsメソッドのオーバーライドについて

Eclipseは以下の警告を出しました。

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

なぜ上記の警告が表示されますか?どのような状況で正しく動作しない可能性がありますか?

+2

良い概観してみてください:http://www.artima.com/lejava/articles/equality.html –

答えて

5

a.equals(b)b.equals(a)の場合は、同じ動作が期待されるのが妥当です。しかし、対応するタイプがBおよびAで継承によって関連し、それらのうちの1つだけが正しくequalsを実装する場合、その動作は2つの例で異なるでしょう。

ここでAはスーパークラスであり、equalsをまったく実装していません(java.lang.Object.equalsを継承しています)。サブクラスBは、nameフィールドに依存して、equalsを上書きします。

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)); 
    } 
} 

当然、出力は、こうしてbreaking symmetryfalseです。私はそれがdifferntだろうと確信しています

+0

私は同意します。スーパークラスが 'equals'を実装していない場合、対称性が損なわれる可能性のある例を構築できますか?私は、警告メッセージが無効であると確信しています。私が見てきたすべての壊れた対称の例は、常にスーパークラスが 'equals'を定義することを要求してきました。 –

+0

@DuncanJones - 上記の編集を参照してください。それはあなたが意味することですか? –

+0

まあ...本当に。 'B'クラスの' equals'メソッドがなぜオブジェクトを 'A'にキャストするのでしょうか?私を間違えないでください - 対称性を破る例を作ることは可能です*しかし、私が見たすべての例は(故意の)重大な欠陥を持っています。 –

0

あなたが等号をオーバーライドするスーパークラスを試してみました...そして自動車は、サブクラスのオーバーライド実装を生成...

。それは、現在の自動で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"); 
} 
関連する問題