我有一个使用@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?或者任何方式?
答案 0 :(得分:2)
即使您进行了此构建,您最终也会遇到损坏的equals
方法,因为如果它们在父字段中具有相同的值,则它不会是对称的(parent.equals(child)
,但是永远不会child.equals(parent)
)。自从我使用Lombok以来已经有一段时间了,但scala案例类(在这方面或多或少相当)因此无法扩展其他案例类。
仔细考虑Parent
和Child
代表的内容。 Child
的{{1}}真的是Liskov可替代的吗?如果是这样,最好从Parent
继承equals
和hashCode
的定义,而不是尝试在Parent
中重新定义它们;如果没有,最好将公共功能提取到Child
和Parent
扩展的公共超类中,而不是将它们作为父级和子级。
答案 1 :(得分:1)
似乎这些类在不同的工件中,或者你进行了增量构建。
1.14之前canEqual
为public
,从那以后protected
。
如果使用Lombok 1.16制作clean
和/或编译Parent
,它应该有效。