[英]Generating equals/hashCode implementation but without a call to superclass, even though this class does not extend java.lang.Object
我在使用lombok
时遇到错误,甚至它也不允许我在创建student
实例时设置 id 和 version。
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;
}
在 main 方法中,它不允许我设置 Id 和版本字段的值
Student s = Student.builder().firstName("Adam").lastName("Kerr").build();
Edit-1 @sfiss - 按照建议,现在我更改如下,但现在我无法设置名字和姓氏,只能设置 cab 设置 ID 和版本
学生.java
@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;
}
}
IModel.java
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class IModel {
private String id;
private String version;
}
这里有多个问题,所有这些问题都与使用带有继承的 lombok 有关:
生成 equals/hashCode 实现但没有调用超类,即使此类没有扩展 java.lang.Object。 如果这是故意的,请将“@EqualsAndHashCode(callSuper=false)”添加到您的类型中。
警告由@Data
给出,因为这通常会在不调用 super 的情况下生成 equals/hashcode。 通过添加@EqualsAndHashCode(callSuper = true)
来修复它。
@Builder
会给你一个编译警告,因为它会在超类和子类中生成两个同名的静态方法。 通过在Student
上定义@Builder(builderMethodName = "studentBuilder")
来修复它。
您将无法在 studentBuilder 上设置超类属性,因为您的超类和子类具有默认构造函数。 通过创建一个构造函数并将@Builder
注释移动到它来修复它(即用@Builder
注释构造函数,而不是 class ):
代码:
@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 作为一种工具(我真的不需要阅读那么多样板文件),但防止样板文件的第一个解决方案是考虑是否需要所有这些 getter 和 setter 并问自己以下问题:
你想要数据包吗? 对于某些用例来说这很好,而在其他用例中,您更希望对象是 OOP 意义上的,即不要暴露您的状态而是行为。
你真的需要可变性吗? 如果没有,请选择@Value
。
您真的需要两种构造函数类型(尤其是无参数构造函数)吗? 他们是这里问题的一部分。 有时您需要它们才能使框架(代理、反射等)正常工作。
更具体到您的代码:您在超类前面加上“I”,但它不是接口。 如果它是一个抽象类,请将其声明为abstract
类并且不要给它一个@Builder
。
我有同样的问题,我以这种方式解决了它希望它对你有帮助。 这也可以帮助您使用抽象类
学生.java
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class Student extends IModel {
@NotEmpty(message = "{email.notempty}")
@Email
private String firstName;
private String lastName;
@Builder
public Student(final String firstName, final String lastName, final String id, final String version) {
super(id, version);
this.firstName = firstName;
this.lastName = lastName;
}
}
IModel.java
@Data
@NoArgsConstructor
@AllArgsConstructor
public class IModel {
private String id;
private String version;
}
当我构建我的 Spring 启动项目时,我收到了 20 个关于同一件事的警告。 警告显示: Generating equals/hashCode implementation but without a call to superclass
此警告来自lombook,当我们使用@Data @ToString @EqualsAndHashCode,IDE 将触发Generating equals/hashCode implementation but without a call to superclass
父类//。
有两种解决方案:
@EqualsAndHashCode(callSuper = true)
src/main/java
。 注意:此解决方案需要 lombook > 1.14 的版本。我推荐解决方案 2,因为您不需要将注释添加到所有必需的类。
要实现该解决方案,您需要在src/main/java
的路径中创建lombook.config
。 如果你有多个包,你可能需要创建多个配置文件。
配置文件的内容包括:
config.stopBubbling=true
lombok.equalsAndHashCode.callSuper=call
当我们重建我们的项目时,您将不会再收到这些警告。
干杯!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.