Lombok @EqualsAndHashCode со Scala — класс case не может наследовать класс Java

У меня есть класс Java с ломбоком, сгенерированным equals и hashCode

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

И класс case 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 Docs явно упоминается взаимодействие с классами case Scala:

Если все классы в иерархии представляют собой смесь классов scala case и классов с методами equals, сгенерированными ломбоком, все равенства будут «просто работать».

Есть ли что-то, что мне здесь не хватает? Я могу обойти это, используя class, а не case class, но тогда мне придется реализовать equals, что не кажется таким элегантным.


person Jack    schedule 09.05.2019    source источник
comment
Интерьер Scala-Java всегда был сомнительным. Вы можете попробовать открыть тикет против Lombok GitHub, но они медленные, и я бы не рекомендовал задерживать дыхание для ответа. Возможно, лучше всего не использовать класс case и переопределить себя.   -  person Abhijit Sarkar    schedule 09.05.2019


Ответы (1)


Возможно, вы можете переопределить метод canEqual в MyJavaClass для замены сгенерированного lombok метода canEqual, например:

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

Таким образом, метод canEqual будет иметь модификатор public.

person chengpohi    schedule 09.05.2019