2

標準マップ (scala) を使用してセット ラッパーを実装しました。ここで、equals (および hashCode) を再定義するときに、セット ラッパーを含むコレクションで参照の等価性、つまり「eq」を使用する必要があります。ただし、正規マップに使用するコレクションでは、実際の「等しい」を使用する必要があります。私は次の解決策を思いつきました:

  override def equals(obj: Any) =
  obj match {
    case o: SetWrapper => (o eq this) || o.set == this.set
    case _ => false
  }

私の質問は、これが本当に必要ですか?

(o eq this) || o.set == this.set

またはこれを使用するのに十分ですか?

  override def equals(obj: Any) =
  obj match {
    case o: SetWrapper => o.set == this.set
    case _ => false
  }

ライブラリは等号を呼び出す前に自動的に「等号」を実行すると推測していますが (== を使用する場合)、よくわかりません。

4

1 に答える 1

2

==を呼び出しequalsnull値を適切に処理します。eqその最適化が必要な場合は、自分自身を呼び出す必要があります。

于 2013-09-09T19:51:54.877 に答える