1

我想使用java.util.Set(和其他集合)但有一个转折:我希望contains(),add()等始终调用 Object's 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故意违反合同的实现,因此您可以使用例如获得具有相同行为的 aMap==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类 (and Equivalence.Wrapper) 来获得该结果,或者基于不同 策略的其他类。

于 2013-01-31T22:09:36.287 回答
-1

如果我没记错的话,您正在寻找的是:

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

我可能会误认为语法..

于 2013-01-31T21:55:22.607 回答