当前位置: 首页 > 知识库问答 >
问题:

生成Equals/HashCode实现,但不调用超类,即使该类没有扩展java.lang.Object

束志业
2023-03-14

我在使用lombok时遇到以下错误,甚至它不允许我在创建student实例时设置id和版本。

Multiple markers at this line
    - overrides com.example.demo.IModel.canEqual
    - Generating equals/hashCode implementation but without a call to superclass, even though this class does not extend java.lang.Object. If this is 
     intentional, add '@EqualsAndHashCode(callSuper=false)' to your type.
    - overrides com.example.demo.IModel.hashCode
    - overrides com.example.demo.IModel.toString
    - overrides com.example.demo.IModel.equals

伊莫德尔

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class IModel {
    private String id;
    private String version;
}

学生

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Student extends IModel{
    private String firstName;
    private String lastName;
}

Student s = Student.builder().firstName("Adam").lastName("Kerr").build();
@Data
@Builder(builderMethodName = "studentBuilder")
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class Student extends IModel {
    @NotEmpty(message = "{email.notempty}")
    @Email
    private String firstName;
    private String lastName;

    public Student(final String firstName, final String lastName, final String id, final String version) {
        super(id, version);
        this.firstName = firstName;
        this.lastName = lastName;
    }
}
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class IModel {
    private String id;
    private String version;
}

共有1个答案

胡修伟
2023-03-14

这里有多个问题,所有这些问题都与使用带有继承的lombok有关:

>

  • 生成equals/hashCode实现,但不调用超类,即使该类没有扩展java.lang.Object。如果这是有意的,请将'@equalsandHashCode(callsuper=false)'添加到您的类型中。

    该警告由@data给出,因为它通常生成equals/hashcode,而不调用super。通过添加@equalsandhashcode(callSuper=true)来修复它。

    @Builder(builderMethodName = "studentBuilder")
    public Student(
        final String firstName,
        final String lastName,
        final String id,
        final String version) {
        super(id, version);
        this.firstName = firstName;
        this.lastName = lastName;
    }
    

    使用正确的方法调用生成器(imodel.builder()student.studentbuilder()):

    Student.studentBuilder().firstName("Name").build();
    

    我还想对上述解决方案添加一些改进。虽然我喜欢lombok作为一个工具(我真的不需要读那么多样板),但防止样板的第一个解决方案是想想你是否需要所有这些getters和setters,然后问自己这些问题:

    >

  • 您想要成袋的数据吗?对于某些用例来说,这是很好的,而在另一些用例中,您需要的对象更多的是OOP意义上的对象,即不要公开您的状态而是公开您的行为。

    你真的需要可变性吗?如果不是,则首选@value

    您真的需要这两种构造函数类型(特别是no-args-constructor)吗?他们是这里问题的一部分。有时您需要它们来使框架(代理、反射等)正常工作。

    更具体到您的代码:您在超类前面加上了“i”,但它不是一个接口。如果它是一个抽象类,请将其声明为abstract,而不要给它一个@builder

  •  类似资料:
    • 我已经习惯了从命令行使用XJC工具。但是我意识到我不能使用它生成带有和方法的Java类。我用了这个: 1.可以用CXF XJC Maven插件从DTD文件生成和方法吗?

    • 我正试着把a类扩展成AX类。所以,我也扩展了abuilder。但是,虽然我能够使用以下方法创建类a的对象: 同样的方法对AX不起作用。当我尝试这样做时:

    • 问题内容: 如果我只需要比较对象并且还不打算将对象放入任何基于哈希的容器中,我是否只能实现equals()而不是hashCode()? 似乎所有Java圣经都说这两个必须一起实现。:( 我的担心:-如果我始终将hashCode()与equals()一起实现,将有很多未真正使用的代码,并且没有单元测试的内容。(如果不使用,我不会进行单元测试hashCode())-直到将对象放入基于哈希的容器中时,我

    • 问题内容: 有一个简单的程序代码。在构造函数中,没有扩展到超类的调用,我不明白在这种情况下会发生什么? 问题答案: 没有显式扩展另一个类的每个类都隐式扩展。因此,只需调用Object的no-arg构造函数。 请注意,此显式调用是不必要的,因为编译器会为您添加它。当您要使用参数调用超类构造函数时,只需在构造函数中添加调用。

    • 我希望有一个方法返回一个类 ,该类根据作业类型具有不同的方法。 例如,作业类型可以是 或 。它们不共享方法,但需要从单个方法getJob()中获取它们。 现在我有一个普通的类< code>job,它的方法返回< code>null,没有构造函数,因为我在< code>getJob()方法中构造了其他类(例如BackupJob或RunCommandJob)。 在返回单个类的同时获得不同工作类的最佳方

    • 我有一个打字错误310.4。1在Ubuntu20.04上安装(composer模式),使用PHP7.4和mariadb数据库,并安装扩展名“extension Builder”(v10兼容性)。当我使用扩展生成器使用域模型创建一个新的扩展并保存它时,将其添加到编写器时,也不会出现错误。json并运行composerrequire命令。但是,数据库中没有创建表。 有人知道从哪里开始寻找问题吗? 提前