【发布时间】:2019-09-26 19:23:59
【问题描述】:
我有一个 Java 类,生成了一个 lombok equals 和 hashCode
@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方法似乎是protected(the Lombok docs 也提到了这一点)Scala
Equalstrait 有一个publiccanEqual方法。
Lombok Docs 明确提到与 Scala 案例类的互操作性:
如果层次结构中的所有类都是 scala 案例类和具有 lombok 生成的 equals 方法的类的混合,则所有相等都将“正常工作”。
这里有什么我遗漏的吗?我可以通过使用class 而不是case class 来解决这个问题,但是我必须实现equals,这似乎不太优雅。
【问题讨论】:
-
Scala-Java 的内部一直是不确定的。您可以尝试向 Lombok GitHub 开票,但它们速度很慢,我不建议您屏住呼吸寻求答案。您最好的选择可能是不使用案例类,并且覆盖等于您自己。
标签: java scala inheritance lombok