我遇到了equals()
和hashcode()
的意外问题。
Eclipse拒绝正确生成它们,因为Class
不会覆盖它们。哦,呃。
所以我必须通过.getName()
结果对它们进行比较,但这很难看。
private Class<T> clientClass;
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + clientClass.getName().hashCode();
return result;
}
@Override
public boolean equals(Object obj)
{
if (this == obj) return true;
if (obj == null) return false;
if (!(obj instanceof MessageChannel)) return false;
MessageChannel<?, ?> other = (MessageChannel<?, ?>) obj;
if (!clientClass.getName().equals(other.clientClass.getName())) return false;
return true;
}
请注意,T是一个参数。
如何正确地做到这一点?
答案 0 :(得分:3)
您无需为了处理equals
和hashcode
类而做一些特别的事情。当前行为(继承自Object
)在语义上是正确的。 (如果Eclipse警告您,请忽略它。警告不正确。)
我是否有可能获得代表同一类的两个不同的Class实例?对象只是在它们上使用== afaik。也许有两个类加载器或其他什么,我对这种反射魔法并不熟悉。
是的,这是可能的。
但在这种情况下,从Java类型系统的角度来看,它们实际上是不同的类。 (有关详细信息,请参阅JLS 4.3.4。)因此,应将它们视为不相等。
答案 1 :(得分:0)
我建议您关注
@Override
public boolean equals(Object that) {
return EqualsBuilder.reflectionEquals(that, this);
}
@Override
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
你可以阅读更多有关这个漂亮的建设者的信息 http://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/builder/package-summary.html