1

私はJavaのばかげたことを理解していません。あなたが私のためにそれを片付けてくれることを望んでいました.

私が定義したHashset<Point> myHashSet = new HashSet<Point>();

次に、2 つの等しい Point ポイントを作成Point p1 and Point p2し、それらを異なる変数/メモリ ロケーションに配置します。次に、.equals() メソッドをオーバーライドしてpublic boolean equals(Point other)、最初のポイント p1 を HashSet に追加しました。

それから私は電話しますSystem.out.println(myHashSet.contains(p2)); // prints false

コンパイラは、作成時に「ああ、このハッシュセットは Point 型です」と推測できず、「Point がデフォルトの equals メソッドをオーバーライドしているかどうかを確認する必要があります...うん、それを呼び出しましょう!」と言うことができるのはなぜですか? .

代わりに、オブジェクトのジェネリック equals メソッドを呼び出して、メモリの場所を比較していると思いますか?

これの理由は、単に HashSet に別の Equals メソッドを使用する Point のサブクラスを含めることができるということですか? これが現在の動作について確認できる唯一の理由ですが、何かを見落としていると確信しています:)。どうもありがとう。

4

4 に答える 4

6

コレクションObject.equals(Object)は、オーバーライドする必要があるものを使用します。そのような別のメソッドを作成しても、equals(Point)それは呼び出されません。

代わりに、オブジェクトのジェネリック equals メソッドを呼び出して、メモリの場所を比較していると思いますか?

はい、HashSet一般的に呼び出すことができる唯一のメソッドはequals(Object)

これの理由は、単に HashSet に別の Equals メソッドを使用する Point のサブクラスを含めることができるということですか?

HashSet には、実行時に代わりにこのメソッドを使用する必要があることを知る方法がありません。

于 2013-03-28T12:20:18.417 に答える
2

HashSet を使用するため、このドキュメントhttp://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#hashCode%28%29に従って equals() と hashCode() の両方をオーバーライドする必要があります。オブジェクトが等しいかどうかを確認するこれらのメソッドの両方

于 2013-03-28T12:21:36.613 に答える
2

クラスpublic boolean equals(Point other)で定義されているデフォルトの equals メソッドではないため、問題は にあります。Object

public boolean equals(Object other)HashMap で実装を使用する場合は、オーバーライドする必要があります(Point ではなく Object に注意してください)。Object のドキュメントを参照し、オーバーライドする場合はメソッドequalsもオーバーライドする必要があることに注意してくださいhashCode()

于 2013-03-28T12:23:11.010 に答える
1

@Overrideアノテーションを追加してみてください。equals メソッドとそのシグネチャのスペルが間違っている必要があります。

    @Override
    public boolean equals(Object obj) {
        // TODO Auto-generated method stub
        return super.equals(obj);
    }                
于 2013-03-28T12:25:28.687 に答える