1

私はjava.util.Set(および他のコレクション)を使用したいのですが、ひねりを加えて:contains()、などが常にadd()オブジェクトを呼び出したい(つまり、より一般的には平等ではなくアイデンティティに基づいて動作します)。equals()方法はあると思いますが、大きな欠点があります。これを行う適切な方法はありますか?明らかな何かが欠けている場合は申し訳ありません。

これが私がしたことです:

public class OnlySelfEqual {
    public final boolean equals(Object o){
        return super.equals(o);
    }
}

public class Example{
    private Set<T extends OnlySelfEqual> set;
    //etc
}

これで私が目にする主な問題(他にもたくさんあるかもしれません)は、すべてのTがインターフェイスを実装するのではなく、クラスから拡張する必要があることです。これはかなり制限があります。私が欲しいのは、サブタイプが実装できない(オーバーライドする)メソッドをリストする「リバース」インターフェースのようなものだと思います。私はそれが存在しないとかなり確信しています。助言がありますか?

4

3 に答える 3

8

java.util.IdentityHashMapではなくを使用して意図的に契約Mapに違反する実装であるため、たとえばを使用して同じ動作で を取得できます。Map==equals()Set

Set<String> set = Collections.newSetFromMap(new IdentityHashMap<String, Boolean>());
于 2013-01-31T21:55:11.820 に答える
2

equals()ラップされたオブジェクトのアイデンティティを使用して実装するコンテナー内にオブジェクトをラップできます。

public class Wrapper<T> {
    // Either public (it's final), or private with a getter
    public final T element;

    public Wrapper(T element) {
        this.element = element;
    }

    public boolean equals(Object o) {
        if (o == this) {
            return true;
        } else if (o == null || o.getClass() != getClass()) {
            return false;
        }
        return element == ((Wrapper<?>) o).element;
    }

    public int hashCode() {
        return System.identityHashCode(element);
    }
}

次に、、などを使用しSet<Wrapper<T>>ますList<Wrapper<T>>

Guava (JDK を補完する多くの便利なものが含まれています) を使用する場合、そのEquivalenceクラス (およびEquivalence.Wrapper) を直接使用して、その結果、またはさまざま な戦略に基づく他の結果を取得できます。

于 2013-01-31T22:09:36.287 に答える
-1

私の記憶が正しければ、あなたが探しているのは次のとおりです。

T t = ...
((Object)t).equals( other );

私は構文について間違っているかもしれません..

于 2013-01-31T21:55:22.607 に答える