代码之家  ›  专栏  ›  技术社区  ›  MightyPork

hashCode()和equals()与Class<T>

  •  0
  • MightyPork  · 技术社区  · 10 年前

    我遇到了一个意想不到的问题 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 回复  |  直到 10 年前
        1
  •  3
  •   Stephen C    10 年前

    你不需要做一些特殊的事情 equals hashcode 对于类。当前行为(继承自 Object )在语义上是正确的。(如果Eclipse警告您,请忽略它。警告不正确。)

    难道我不可能得到代表同一类的两个不同的Class实例吗?对象只在它们上使用==afaik。也许有两个类加载器之类的,我对这种反射魔法不太熟悉。

    是的,这是可能的。

    但在这种情况下,他们实际上是 不同的类别 从Java类型系统的角度来看。(参见JLS 4.3.4 详细信息。)因此,你 应该 将他们视为不平等。

        2
  •  0
  •   Viggo    10 年前

    我建议你这样做

    @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