У меня есть класс, который расширяет родительский класс, используя @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
[ERROR] attempting to assign weaker access privileges; was public
Есть ли какая-либо передовая практика по наследованию и @EqualsAndHashCode и Lombok, что я злоупотребляю? Или любой путь вокруг этого?
Кажется, что классы находятся в разных артефактах или вы делали инкрементную сборку.
До 1.14 canEqual
был public
, с тех пор он protected
.
Если вы делаете clean
и/или компилируемый Parent
используя Lombok 1.16, он должен работать.
Даже если вы создали эту сборку, у вас получится сломанный метод equals
, потому что он не будет симметричным (parent.equals(child)
если они имеют одинаковые значения в родительских полях, но не child.equals(parent)
), Прошло некоторое время с тех пор, как я использовал Lombok, но классы классов scala (которые в этом отношении более или менее эквивалентны) не могут распространять другие классы case по этой причине.
Подумайте очень внимательно о том, что представляют Parent
и Child
. Действительно ли Child
Лисков-заменяемый для Parent
? Если это так, было бы лучше наследовать определение equals
и hashCode
от Parent
, а не пытаться переопределить их в Child
вообще; если нет, может быть лучше извлечь общую функциональность в общий суперкласс, который распространяется как для Parent
и для Child
, а не для того, чтобы иметь их как родительский и дочерний.
canEqual
чтобы сделать это правильно. Существуют случаи, когда важно обеспечить равные экземпляры подклассов, например прокси Hibernate.