Lombok 在继承类上面的注意

找不到符号异常

在控制台项目中配置Lombok

编译会报错 找不到符号

解决 方法:

父类字段ToString不了

@Data
@NoArgsConstructor
@AllArgsConstructor
public class School {

  public int id;

  public String name;

  public String age;

}

@Data
class ShangHai extends School {
  private String type;
}

测试:

public class test1 {

	public static void main(String[] args) {

		ShangHai shangHai = new ShangHai();
	 	shangHai.setId(1);
     	shangHai.setName("上海大学");
		shangHai.setType("A");
		System.out.println(JSON.toJSONString(shangHai));
		System.out.println(shangHai.hashCode());
		ShangHai shangHai2 = new ShangHai();
		shangHai2.setId(2);
		shangHai2.setName("华东师范");
		shangHai2.setType("A");
		System.out.println(shangHai2.hashCode());
		System.out.println(JSON.toJSONString(shangHai2));
		System.out.println(shangHai.equals(shangHai2));
		System.out.println(shangHai.toString());
		System.out.println(shangHai2.toString());
	}
}

Output:

{"id":1,"name":"上海大学","type":"A"}
124
124
{"id":2,"name":"华东师范","type":"A"}
true
ShangHai(type=A)
ShangHai(type=A)

可以明显发现,School类里面的字段都没有toString,并且equals还是相等的。

解决:

@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
class ShangHai extends School {
  private String type;
}

输出;

{"id":1,"name":"上海大学","type":"A"}
-890203766
549614978
{"id":2,"name":"华东师范","type":"A"}
false
ShangHai(super=School(id=1, name=上海大学, age=null), type=A)
ShangHai(super=School(id=2, name=华东师范, age=null), type=A)

其实在上面的情况时,鼠标放在@Data上,会自动提示异常

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.

大致意思是默认子类的equals和hashCode方法,不会包含或者考虑基类的属性。我们可以通过反编译工具查看项目target/classes目录下的ShangHai.class的hashCode方法,默认情况下属性都是使用的他自身的属性。

当我们根据警告提示,加上注解@EqualsAndHahsCode(superCall=true) ,警告消失。

lombok.config

另外,lombok作者Roel也给出了解决办法,就是通过自定义lombok.config文件来解决。

按照Roel的说法,lombok.config文件需要放在src/main/java文件夹下的目录中(也可以放在实体同级目录下),放在src/main/resources目录下,不会生效。下面,我们通过这种方式来解决这个警告的问题。

config.stopBubbling=true
lombok.equalsAndHashCode.callSuper=call

注意上面的callSuper=call,并不是true,false

可以看到,配置生效了,然后@Data注解这里的警告也立马消失了。

参考:

lombok注解@Data使用在继承类上时出现警告

lombok踩坑与思考

Lombok用于继承时应注意的点

posted @   hongdada  阅读(5126)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
历史上的今天:
2017-02-22 JavaConfig 使用Java代码进行显示配置
点击右上角即可分享
微信分享提示