我有一个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,似乎是因为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
修饰符。