场景设定
假设存在父类 IotMessage 和子类 PointCheckMessage(即你的代码),结构如下:
java
运行
// 父类:包含一个标识消息类型的属性
@Data
public class IotMessage {
private String messageType; // 消息类型(如"点检消息"、"报警消息")
}
// 子类:继承自IotMessage,添加自身属性
@Data
@EqualsAndHashCode(callSuper = true) // 关键注解
public class PointCheckMessage extends IotMessage {
private String title;
private String content;
private Long configId;
}
测试案例
我们创建两个 PointCheckMessage 对象,对比它们的 equals() 结果:
java
运行
public class Test {
public static void main(String[] args) {
// 对象1:父类属性messageType="check",子类属性title="点检1"
PointCheckMessage msg1 = new PointCheckMessage();
msg1.setMessageType("check"); // 父类属性
msg1.setTitle("点检1");
msg1.setContent("内容1");
msg1.setConfigId(1L);
// 对象2:父类属性messageType="check",子类属性title="点检1"(与msg1完全相同)
PointCheckMessage msg2 = new PointCheckMessage();
msg2.setMessageType("check"); // 父类属性
msg2.setTitle("点检1");
msg2.setContent("内容1");
msg2.setConfigId(1L);
// 对象3:父类属性messageType="alarm"(不同),子类属性与msg1相同
PointCheckMessage msg3 = new PointCheckMessage();
msg3.setMessageType("alarm"); // 父类属性不同
msg3.setTitle("点检1");
msg3.setContent("内容1");
msg3.setConfigId(1L);
// 比较结果
System.out.println(msg1.equals(msg2)); // true(父类+子类属性全相同)
System.out.println(msg1.equals(msg3)); // false(父类属性不同)
}
}
关键说明
由于 @EqualsAndHashCode(callSuper = true),生成的 equals() 方法会同时检查:
父类 IotMessage 的 messageType 属性;
子类 PointCheckMessage 自身的 title、content、configId 等属性。
如果去掉 callSuper = true(即默认 callSuper = false):
生成的 equals() 只会检查子类自身属性,忽略父类的 messageType;
此时 msg1.equals(msg3) 会返回 true(因为子类属性相同),但逻辑上两者的消息类型不同,显然是错误的。
这个案例体现了 callSuper = true 的核心作用:确保子类对象的相等性判断包含父类属性,避免因忽略父类状态导致的逻辑错误。