【问题标题】:Lombok inheritance with @EqualsAndHashCode使用 @EqualsAndHashCode 进行 Lombok 继承
【发布时间】:2015-01-27 16:16:33
【问题描述】:

我有一个使用@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 的最佳实践?或者有什么办法?

【问题讨论】:

    标签: java java-8 lombok


    【解决方案1】:

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

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

    【讨论】:

    • 感谢周到的回复。我认为这解释了最佳行动方案,但 zeroflag 的回答解释了为什么这在技术上会发生。
    • 其实,Lombok 做得对,见this comment。它支持这两种情况,但您可能需要覆盖canEqual 才能正确处理。在某些情况下,允许子类的实例相等是必不可少的,例如 Hibernate 代理。
    【解决方案2】:

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

    在 1.14 之前canEqualpublic,从那以后它是protected

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

    【讨论】:

      猜你喜欢
      • 2021-06-18
      • 2019-09-26
      • 2019-11-16
      • 2020-07-18
      • 1970-01-01
      • 1970-01-01
      • 2018-10-02
      • 1970-01-01
      • 2020-08-22
      相关资源
      最近更新 更多