hashCode()和equals()与Class <t> </t>

时间:2014-03-31 21:48:27

标签: java class equals hashcode

我遇到了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是一个参数。

如何正确地做到这一点?

2 个答案:

答案 0 :(得分:3)

您无需为了处理equalshashcode类而做一些特别的事情。当前行为(继承自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