5

equals メソッドには 2 種類ありますか?

public boolean equals(Bigram b) {
    return b.first == first && b.second == second;
    }

@Override public boolean equals(Object o) {
    if (!(o instanceof Bigram))
        return false;
    Bigram b = (Bigram) o;
    return b.first == first && b.second == second;
}

equals メソッドをオーバーライドしたい場合、2 つのメソッドと比較してください。なぜ、パラメータがObject 型である equals メソッドを定義する必要があるのでしょうか。

4

3 に答える 3

6

これには実際には正当な理由があります。

  • equals(Object)スーパークラスの equals メソッドをオーバーライドするメソッドが必要ですjava.lang.Object
  • また、コンパイラがコンパイル時に型が Bigram であることを証明できるケースを処理する、オーバーロードされたメソッドが必要になることよくあります。equals(Bigram)これにより、型チェック/キャストを回避することでパフォーマンスが向上し、コードの型チェックが向上します。
  • 最後に、それ自体が Bigram のインスタンスではないオブジェクトとの等価性をテストするために、equals を特別な方法で実装したい場合があります。これは注意して使用する必要があります (Bigram インスタンスではないものを Bigram と等しいと見なしたいですか?)。

ただし、通常は、一方のメソッドが他方を呼び出すように実装するのが最善です。たとえば、次のようになります。

public boolean equals(Bigram b) {
    return b.first == first && b.second == second;
}

@Override public boolean equals(Object o) {
    if (!(o instanceof Bigram)) return false;
    return equals((Bigram)o);
}

この方法はより簡潔であり、等価性テスト ロジックを 1 回だけ実装する必要があることを意味します (同じことを繰り返さないでください!)。

于 2012-10-16T05:28:12.320 に答える
2

equals()メソッドを呼び出すフレームワーク/API (containsKey()マップ、contains()リストなど)equals()は、オーバーロードされたバージョンではなく、Objectクラスからオーバーライドされたものを呼び出します。したがって、を定義する必要public boolean equals(Object obj)があります。

于 2012-10-16T05:31:21.220 に答える
2

オーバーライドする場合はメソッド引数を絞り込むことができないため、はい、戻り型はサブタイプにすることができます。以下のリンクを確認してください。

http://docs.oracle.com/javase/tutorial/java/IandI/override.html

于 2012-10-16T05:31:50.860 に答える