Lombok @EqualsAndHashCode с Scala - класс case не может наследовать класс Java - PullRequest
1 голос
/ 09 мая 2019

У меня есть класс 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 1.16, и, похоже, начиная с версии 1.14, метод canEqual, сгенерированный Lombok, protected ( Документы Lombok тоже упоминают об этом)

  • Черта Scala Equals имеет метод public canEqual.

В Lombok Docs прямо упоминается возможность взаимодействия с классами дел Scala:

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

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

1 Ответ

0 голосов
/ 09 мая 2019

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

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

Этот способ сохранит canEqual метод имеетpublic модификатор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...