3

彼を拡張するNode抽象クラスを持つ。Cell

Cell実装しpublic boolean equals(Node cmpCell)ました。私created Set<Node> closeList = new HashSet<Node>();が実行すると、closeList.contains((Cell) node)それをデバッグし、実装されたものを完全に無視していることを検出しましたCell equals。私は何を間違えましたか?

編集 :

に着替えましCell

@Override
public boolean equals(Object cmpCell)

上記の override をまだcloseList.contains((Cell) node)使用していません。

2回目の編集:

Cellクラスには2人のメンバーがいます-

int colIndex ;
int rowIndex ;

オーバーライドは、equalsそれらを2番目のクラスの両方のメンバーと比較するだけHashMap<K, V>ですhashCode

4

4 に答える 4

11
public boolean equals(Node cmpCell)

これは有効なオーバーライドではありません。クラスのequalsメソッドの構文は次のとおりです。Object

public boolean equals(Object)

そして、はい、コメントで@JonSkeetが指摘しているように、メソッドをオーバーライドするときはいつでも、メソッドをオーバーライドしてとのコントラクトに従うことequalsを忘れないでください。そうしないと、メソッドshowsがインスタンスを等しいと評価したとしても、クラスのデフォルトの実装がインスタンスを生成するため、インスタンスは等しくなりません。hashCodeequalshashCodeequalshashCodeObjectdifferent hashCodes

また、計算時に、メソッドhashcodeでインスタンスを比較するために使用した属性のみを考慮するようにしてくださいequals。それ以外の場合も、誤った結果が得られます。

それに加えて、EclipseのようなIDEを使用している場合は、非常にうまくオーバーライドされ、互換性のあるメソッドが生成さequalshashCodeます。あなたはそれらをよりよく使うべきです。right-clickクラスに参加し、に移動してsourceを選択する必要がありますGenerate equals and hashCode method

于 2012-11-25T19:57:29.133 に答える
1

おそらく、hashCodeメソッドをオーバーライドしていません。

ハッシュセット内のオブジェクトは、最初にハッシュコードを使用して検出されます。equals常に2つのメソッドとメソッドの両方をオーバーライドするか、どちらもオーバーライドしない必要がありますhashCode

于 2012-11-25T19:57:29.673 に答える
1

3 つの潜在的な問題があります。

  1. 間違った署名を上書きしました。する必要がありますpublic boolean equals(Object)

  2. equals をオーバーライドする場合は、hashCode を実装する必要があります

  3. あなたの equals メソッドは対称的ですか (x.equals(y) は y.equals(x) を意味します)、ポリモーフィズムで正しく動作しますか? つまり、Node.equals(Cell) を持つことができますが、逆は false になりますか?

于 2012-11-25T20:03:50.733 に答える
0

すでに述べたように、それに応じて実装する必要がありますhashCodeequals

しかし、ここで問われるのは、「カスタムの equals() が呼び出されないのはなぜですか?」ということです。つまり、答えは、Java は複数のディスパッチをサポートしていないということです。

簡単な例

を宣言した場合Object myCell = new Cell()myCell2.equals(myCell)は myCell の宣言された型、つまり のみを判別できますObject

あなたの場合

呼び出されたメソッドのシグネチャは:HashSet.contains(Object o)であり、上記と同じ結果になります。

良い解決策ではありませんが、そのようなことを行うことができます:

public class Cell {
    @Override
    public boolean equals(Object o) {
        if(o instanceof Cell) {
            // your code
        }

        super.equals(o);
    }
}
于 2012-11-25T21:21:01.263 に答える