lombok @equalsandhashcode带有scala -case类无法继承Java类



我有一个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,似乎是因为Lombok生成的canEqual方法是protected(Lombok Docs也提到了这一点(

  • Scala Equals特质具有public canEqual方法。

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

如果层次结构中的所有类都是Scala案例类和与Lombok-Ferated Equals方法的组合,那么所有平等都会"工作"。

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

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

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

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

最新更新