我想使用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必须从类扩展而不是实现接口,这是非常有限的。我想我想要的就像一个'反向'接口,它列出了子类型无法实现的方法(覆盖)。我很确定不存在。有什么建议吗?
答案 0 :(得分:8)
java.util.IdentityHashMap
是Map
实施,使用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 );
我可能会误解语法..