使用@EqualsAndHashCode继承Lombok

时间:2015-01-27 16:16:34

标签: java java-8 lombok

我有一个使用@EqualsAndHashCode扩展父类的类。我收到了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?或者任何方式?

2 个答案:

答案 0 :(得分:2)

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

仔细考虑ParentChild代表的内容。 Child的{​​{1}}真的是Liskov可替代的吗?如果是这样,最好从Parent继承equalshashCode的定义,而不是尝试在Parent中重新定义它们;如果没有,最好将公共功能提取到ChildParent扩展的公共超类中,而不是将它们作为父级和子级。

答案 1 :(得分:1)

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

1.14之前canEqualpublic,从那以后protected

如果使用Lombok 1.16制作clean和/或编译Parent,它应该有效。