この投稿では、インターフェイスと匿名クラスを使用するソリューションを提案しました。ただし、実装する必要があるのはhashCodeandequalsメソッドです。
equalsただし、インターフェイスを実装する匿名クラスには実装が難しいことがわかりました。その例では、インターフェースはPair<L,R>であり、ファクトリメソッドPairs.makePairはその匿名実装を返します。実装を追加したとequalsします。ユーザーは別のコードを使用して独自のPair<L,R>クラスを実装できるequalsため、呼び出しでuserobj.equals(makepairobj)コードが入力されmakepairobj.equals(userobj)、私のコードが入力されます。私は彼らのコードを制御できないので、対称であることを確認するのは難しいequalsです。これは、適切な実装に必要です。
この問題は他の場合にもよくあることだと思いますが、この問題が一般的にどのように対処されているのか知りたいのですが。
編集:通常のクラスでは、の実装はequalsパラメータタイプをチェックして、それがそれ自体と同じであることを確認します。これにより、オブジェクトを比較するために実装コードのみが呼び出されることが保証されます。ただし、匿名クラスには名前がなく、タイプを.で確認することはできませんinstanceof。私にできることは、それが実装インターフェース/クラスのインスタンスであることを確認することです。これは、上記のシナリオを防ぐのに十分ではありません。