Lombok 继承@EqualsAndHashCode

Lombok inheritance with @EqualsAndHashCode

我有一个 class,它使用 @EqualsAndHashCode 扩展父 class。我在使用 Lombok 1.16.0 和 Java 8

时遇到编译错误

@EqualsAndHashCode(doNotUseGetters = true, of = { "propertyA", "propertyB" }) public class Parent {...}

@EqualsAndHashCode(callSuper = true, doNotUseGetters = true, of = { "propertyC", "propertyD" }) public class Child extends Parent {...}

错误是...

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project granger: Compilation failure [ERROR] /Users/sarah/src/main/java/com/xxx/Child.java:[26,1] canEqual(java.lang.Object) in com.xxx.Child cannot override canEqual(java.lang.Object) in com.yyy.Parent [ERROR] attempting to assign weaker access privileges; was public

关于继承和我滥用的@EqualsAndHashCode 和 Lombok 是否有任何最佳实践?或者有什么办法解决这个问题?

即使您进行了此构建,您最终也会得到一个损坏的 equals 方法,因为它不会是对称的(parent.equals(child) 如果它们在父字段中具有相同的值,但是从不 child.equals(parent))。自从我使用 Lombok 以来已经有一段时间了,但是 scala case 类(在这方面或多或少是等效的)不能扩展其他 case 类 因为这个原因。

仔细想想 ParentChild 代表什么。 Child 真的可以用 Liskov 替代 Parent 吗?如果是这样,最好从 Parent 继承 equalshashCode 的定义,并且根本不要尝试在 Child 中重新定义它们;如果不是,最好将公共功能提取到一个公共超类中,ParentChild 都扩展,而不是将它们作为父类和子类。

类 似乎在不同的工件中,或者您进行了增量构建。

1.14 之前 canEqualpublic,之后是 protected

如果您使用 Lombok 1.16 创建 clean 和/或编译 Parent,它应该可以工作。