在我的MyClass级课程中,我有一个@Override for equals():

public class MyClass extends MySuperClass
{
  ...
  @Override
  public boolean equals( Object o )
  {
    if ( this == o )
    {
      return true;
    }
    if ( o == null || this.getClass() != o.getClass() )
    {
      return false;
    }
    if ( !super.equals( o ) )
    {
      return false;
    }
    MyClass that = ( MyClass ) o;
    return this.var1.equals( that.var1 ) && this.var2.equals( that.var2 );
  }
  ...
}

相当标准.事实上,它遵循Java最佳实践
在以后的生活中,我在另一个子包类(我的控制器类)中有这个:

...
package com.a.b.api.controllers;
...
import com.a.b.jpa.models.MyClass;
...
MyClass myObject1 = new MyClass( var1, var2 );
MyClass myObject2 = this.myClassRepository.getById( 1 ); // SpringBoot/Jpa/Hibernate

if ( myObject2.equals( myObject1 ) )
{
   ...do something...
}
...
this.myClassRepository.save( myObject1 );
...

我的问题是,.equals()在这里总是失败:

if ( o == null || this.getClass() != o.getClass() )

因为java说this.getClass()o.getClass()等于NOT.当我调试代码(在Intellij IDEA 2022.1 UE中)时,我看到:

这.GetClass()=MyClass@13706

但是

o、 getClass=com.a、 b.jpa.模型.MyClass@8f7462

但他们是同一个班的!几乎每一本Java书籍、教程、博客、Intellij IDEA等都以这种方式演示了.equals().我在Ubuntu20.04.4 LTS java-14-openjdk-amd64java-17-openjdk-amd64中try 过这个,结果是一样的.

我做错了什么?

推荐答案

100在他的回答中正确地指出:

myObject2是一个代理类的实例,由Hibernate在运行时使用Byte Buddy生成.生成的代理截获所有方法调用,这就是getClass()返回不同结果的原因.

我真的不想使用instanceof,因为这被认为是一种不好的做法,所以我开始四处闲逛,偶然发现了一个类似的问题.他们的解决方案是在类声明中添加100关键字.我认为这无关紧要,但try 一下——AND IT WORKED!加上100关键字

if ( o == null || this.getClass() != o.getClass() )

if ( o == null || !this.getClass().equals( o.getClass() ) )

正常工作.我的班级代码是:

final public class MyClass extends MySuperClass
{
  ...
  @Override
  public boolean equals( Object o )
  {
    if ( this == o )
    {
      return true;
    }
    if ( o == null || !this.getClass().equals( o.getClass() ) )
    {
      return false;
    }
    if ( !super.equals( o ) )
    {
      return false;
    }
    MyClass that = ( MyClass ) o;
    return this.var1.equals( that.var1 ) && this.var2.equals( that.var2 );
  }
  ...
}

谢谢大家的帮助!非常感谢100为我指明了正确的方向!

Java相关问答推荐

int Array Stream System. out. print方法在打印Java8时在末尾添加% sign

为什么一个java函数会返回一个作为参数传递给它的对象?

Character::Emoji不支持带数字的字符吗?

将数组整体转换为链接表

如何使用Maven和Spring Boot将构建时初始化、跟踪类初始化正确传递到本机编译

将不受支持的时区UT重写为UTC是否节省?

如何找到MongoDB文档并进行本地化?

Javadoc在方法摘要中省略方法

匹配一组字符或另一组字符

Java连接池无法正常工作

继续收到错误SQLJDBC EXCEPTION执行";org.springframework.dao.InvalidDataAccessResourceUsageException:&

我可以在@Cacheable中使用枚举吗

AbstractList保证溢出到其他方法

当我在Java中有一个Synchronized块来递增int时,必须声明一个变量Volatile吗?

在实例化中指定泛型类型与不指定泛型类型之间的区别

如何修复Spring Boot应用程序中的RestDocumentationGenerationException:java.io.FileNotFoundException:/curl-request.adoc(只读文件系统)?

从字节数组切换到JakartaMail org.springframework.mail.javamail.JavaMailSender InputStreamResource

如何设置默认序列生成器分配大小

using case default on switch语句返回;预览特征切换中的模式匹配仅在源级别20及以上的情况下可用;

在 Java Spring Boot 中注入而不是实例化抽象类