【问题标题】:Lombok @EqualsAndHashCode with Scala - case class cannot inherit Java class带有 Scala 的 Lombok @EqualsAndHashCode - 案例类不能继承 Java 类
【发布时间】:2019-09-26 19:23:59
【问题描述】:

我有一个 Java 类,生成了一个 lombok equalshashCode

@EqualsAndHashCode
@AllArgsConstructor
public class MyJavaClass {
    private final String foo;
}

还有一个继承了这个的 Scala 案例类:

case class MyScalaCaseClass(foo: String, bar: String) extends MyJavaClass(foo)

我得到以下编译时错误:

[scalac-2.12] .../MyScalaCaseClass.scala:5: error: overriding method canEqual in trait Equals of type (that: Any)Boolean;
[scalac-2.12]  method canEqual in class MyJavaClass of type (x$1: Any)Boolean has weaker access privileges; it should be public
[scalac-2.12] case class MyScalaCaseClass(foo: String, bar: String) extends MyJavaClass(foo)
[scalac-2.12]            ^
[scalac-2.12] one error found

看来这个问题似乎是访问权限不匹配造成的:

  • 我使用的是 Lombok 1.16,从 1.14 开始,Lombok 生成的 canEqual 方法似乎是 protectedthe Lombok docs 也提到了这一点)

  • Scala Equals trait 有一个public canEqual 方法。

Lombok Docs 明确提到与 Scala 案例类的互操作性:

如果层次结构中的所有类都是 scala 案例类和具有 lombok 生成的 equals 方法的类的混合,则所有相等都将“正常工作”。

这里有什么我遗漏的吗?我可以通过使用class 而不是case class 来解决这个问题,但是我必须实现equals,这似乎不太优雅。

【问题讨论】:

  • Scala-Java 的内部一直是不确定的。您可以尝试向 Lombok GitHub 开票,但它们速度很慢,我不建议您屏住呼吸寻求答案。您最好的选择可能是不使用案例类,并且覆盖等于您自己。

标签: java scala inheritance lombok


【解决方案1】:

也许您可以覆盖MyJavaClass 中的canEqual 方法来替换lombok 生成的canEqual 方法,例如:

public boolean canEqual(Object other) {
    return other instanceof MyJavaClass;
}

这种方式将保持canEqual 方法具有public 修饰符。

【讨论】:

    猜你喜欢
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多