java阻止类覆盖equals

时间:2013-01-31 21:51:33

标签: java interface override final

我想使用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
}

我看到的主要问题(可能还有很多其他问题)是所有Ts必须从类扩展而不是实现接口,这是非常有限的。我想我想要的就像一个'反向'接口,它列出了子类型无法实现的方法(覆盖)。我很确定不存在。有什么建议吗?

3 个答案:

答案 0 :(得分:8)

java.util.IdentityHashMapMap实施,使用Map而非==故意违反equals()合同,因此您可以获得Set使用例如

具有相同的行为
Set<String> set = Collections.newSetFromMap(new IdentityHashMap<String, Boolean>());

答案 1 :(得分: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)获取that result或基于different strategies的其他内容。

答案 2 :(得分:-1)

如果我没记错的话,你要找的是:

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

我可能会误解语法..