13

このクラスには、Collections、 などのさまざまなコレクション タイプの読み取り専用ビューを提供するための静的ヘルパー メソッドが多数あります。これらのビュー オブジェクトでは、およびメソッドが呼び出しを基になるコレクションに転送します...例外が 1 つあります。unmodifiableSet()unmodifiableList()hashCode()equals()unmodifiableCollection()

JavaDocには明示的に次のように記載されています。

返されたコレクションは、 hashCode および equals 操作をバッキング コレクションに渡しませObjectが、equalsおよびメソッドに依存していhashCodeます。これは、バッキング コレクションがセットまたはリストである場合に、これらの操作のコントラクトを保持するために必要です。

私の質問: これは何について話しているのですか?? unmodifiableSet()バッキング コレクションがセットまたはリストの場合、 and と一貫した動作が期待できますunmodifiableList()。それは hashCode/equals 契約にどのように違反しますか?

4

1 に答える 1

16

コレクションの JavaDoc から:

Object.equals メソッドの一般規約では、equals は対称でなければならない (つまり、a.equals(b) は b.equals(a) の場合のみ) と規定されています。List.equals と Set.equals のコントラクトは、リストは他のリストとのみ同等であり、他のセットに設定されると述べています。したがって、List インターフェースも Set インターフェースも実装しないコレクション クラスのカスタム equals メソッドは、このコレクションが任意のリストまたはセットと比較されたときに false を返す必要があります。(同じロジックでは、Set インターフェイスと List インターフェイスの両方を正しく実装するクラスを作成することはできません。)

anUnmodifiableListは anUnmodifiableCollectionですが、逆は同じではありませんUnmodifiableCollection。a をラップするan はanでListはありませんUnmodifiableList。したがってUnmodifiableCollection、 List をラップする と同じ List をラップするaUnmodifiableList比較するとa、2 つのラッパーは等しくないはずです。ラップされたリストを通過しただけの場合、それらは等しくなります。

于 2012-10-12T02:41:51.423 に答える