これは、Comparator を equals() と一致させるという禁止事項に違反しているようです。つまり、2 つのコレクションは (要素が異なるため) 等しくなくても、同じ値と比較できます (要素の数が同じため)。
Comparator
(Javadoc で) 明言されていようと暗示されていようと、 がオブジェクトの の実装と一致しているという要件はありませんboolean equals(Object)
。
Comparable
とComparator
は、異なる目的を持つ 別個のインターフェイスであることに注意してください。Comparable
クラスの「自然な」順序を定義するために使用されます。equals
その文脈では、とcompateTo
が矛盾していることは悪い考えです。対照的にComparator
、クラスの自然な順序とは異なる順序を使用する場合は、a を使用します。
編集: これは、SortedSet の Javadoc からの完全な段落です。
ソートされたセットが Set インタフェースを正しく実装するためには、(明示的なコンパレータが提供されているかどうかに関係なく) ソートされたセットによって維持される順序付けが equals と一致している必要があることに注意してください。これは、Set インターフェースが equals 操作に関して定義されているためですが、ソートされたセットはその compareTo (または比較) メソッドを使用してすべての要素の比較を実行するためです。であるため、このメソッドで等しいと見なされる 2 つの要素は、並べ替えられたセットの観点からは等しいです。並べ替えられたセットの動作は、その順序付けが equals と一致しない場合でも明確に定義されています。Set インターフェースの一般的な契約に従わないだけです。
最後の文を強調しました。要点は、そのような SortedSet はおそらく期待どおりに機能しますが、一部の操作の動作は仕様と完全に一致しないSet
ということです...仕様ではequals
メソッドの観点から動作が定義されているためです。
したがって、実際には、一貫性の要件が明記されています (私の間違いです) が、それを無視した場合の結果は、あなたが考えるほど悪くはありません。もちろん、それを行うかどうかはあなた次第です。私の推定では、コードを徹底的にコメントし、SortedSet が「リーク」しないことを確認すれば、問題ないはずです。
ただし、コレクションの「サイズ」のみを確認するコレクションの Comparator が機能するかどうかはわかりません...セマンティックな観点から。つまり、(たとえば) 2 つの要素を持つすべてのコレクションが等しいと本当に言いたいのでしょうか? これは、セットに特定のサイズのコレクションを 1 つしか含めることができないことを意味します...