当检查 getClass() 时,同一类的两个对象的 Java equals 实现返回 false

标签 java equals hashcode

我已经使用 NetBeans 的默认设置为对象实现了 hashCode()equals():

@Override
public int hashCode() {
    int hash = 5;
    hash = 37 * hash + this.unitSystemID;
    return hash;
}

@Override
public boolean equals(Object obj) {
    if (this == obj) {
        return true;
    }
    if (obj == null) {
        return false;
    }
    LOGGER.debug(getClass().toString());
    LOGGER.debug(this.getClass().getClassLoader().toString());
    LOGGER.debug(obj.getClass().toString());
    LOGGER.debug(obj.getClass().getClassLoader().toString());
    if (getClass() != obj.getClass()) {
        return false;
    }
    final UnitSystem other = (UnitSystem) obj;
    if (this.unitSystemID != other.unitSystemID) {
        return false;
    }
    return true;
}

在日志检查点,我得到:

units.UnitSystem - class com.utilities.domain.units.UnitSystem

units.UnitSystem - org.springframework.boot.devtools.restart.classloader.RestartClassLoader@42d353e2

units.UnitSystem - class com.utilities.domain.units.UnitSystem_$$_jvst6b1_19ed

units.UnitSystem - org.springframework.boot.devtools.restart.classloader.RestartClassLoader@42d353e2

此时相等失败,equals 返回 false。

额外的_$$_jvst6b1_19ed是什么?它从哪里来?

据我了解,如果这些类来自同一个类加载器,那么它们应该是相等的。我在其他地方使用过此实现,但没有遇到任何问题。为什么 getClass() 返回不同的东西?

最佳答案

除非您自己实际子类化 UnitSystem ,否则不需要精确的类匹配,因此请替换

if (getClass() != obj.getClass()) {
    return false;
}

if (! (obj instanceof UnitSystem)) {
    return false;
}

你不能创建 UnitSystemfinal 因为你希望 Hibernate 能够创建一个子类代理,所以你不能绝对保证 UnitSystem 不会被非 Hibernate 代码子类化,但真的需要这样的绝对保证吗?

关于当检查 getClass() 时,同一类的两个对象的 Java equals 实现返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52993390/

相关文章:

java - 哈希码计算

c# - 什么是 IEqualityComparer<double> 的实现 GetHashCode()

java - Netty 线程被阻塞

java - 为什么方法 Queue#add() 有 boolean 值返回值?

java - 使用 Comparable 比较对象并在 TreeMap 中对它们进行排序

java - Object.toString 或 Object.hashCode 是否给出了对象的内存地址

java - Tomcat启动时的触发函数

java - 如何查看 solr 索引的所有数据?

java - 测试是否与 double 相等

java - Java 中重写 equals() 方法 (OCJP)