Наследование Lombok с @EqualsAndHashCode

У меня есть класс, который расширяет родительский класс, используя @EqualsAndHashCode. Я получаю сообщение об ошибке компиляции с Lombok 1.16.0 и Java 8

@EqualsAndHashCode(doNotUseGetters = true, of = { "propertyA", "propertyB" }) public class Parent {...}

@EqualsAndHashCode(callSuper = true, doNotUseGetters = true, of = { "propertyC", "propertyD" }) public class Child extends Parent {...}

Ошибка...

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project granger: Compilation failure [ERROR] /Users/sarah/src/main/java/com/xxx/Child.java:[26,1] canEqual(java.lang.Object) in com.xxx.Child cannot override canEqual(java.lang.Object) in com.yyy.Parent [ERROR] attempting to assign weaker access privileges; was public

Есть ли какая-либо передовая практика в отношении наследования, @EqualsAndHashCode и Lombok, которой я злоупотребляю? Или как-нибудь обойти это?


person Sarah Haskins    schedule 27.01.2015    source источник


Ответы (2)


Кажется, классы находятся в разных артефактах или вы сделали инкрементную сборку.

До 1.14 canEqualбыло public, с тех пор protected.

Если вы сделаете clean и/или скомпилируете Parent с помощью Lombok 1.16, это должно сработать.

person a better oliver    schedule 27.01.2015

Даже если вы сделаете эту сборку, вы получите сломанный метод equals, потому что он не будет симметричным (parent.equals(child), если они имеют одинаковые значения в родительских полях, но никогда child.equals(parent)). Прошло некоторое время с тех пор, как я использовал Lombok, но классы case scala (которые более или менее эквивалентны в этом отношении) не могут расширять другие классы case по этой причине.

Подумайте очень тщательно о том, что представляют собой Parent и Child. Действительно ли Child можно заменить Лисковым на Parent? Если это так, возможно, было бы лучше унаследовать определение equals и hashCode от Parent и вообще не пытаться переопределять их в Child; если нет, возможно, было бы лучше извлечь общую функциональность в общий суперкласс, который расширяется как Parent, так и Child, а не иметь их как родительский и дочерний.

person lmm    schedule 27.01.2015
comment
Спасибо за вдумчивый ответ. Я думаю, что это объясняет лучший способ действий, но ответ нулевого флага объясняет, почему это происходило технически. - person Sarah Haskins; 28.01.2015
comment
На самом деле, Lombok делает это правильно, см. этот комментарий. Он поддерживает оба случая, но вам может потребоваться переопределить canEqual, чтобы все было правильно. Бывают случаи, когда необходимо разрешить равенство экземпляров подклассов, например, прокси-серверы Hibernate. - person maaartinus; 20.04.2018