родительский конструктор в родительском классе не может быть применен к данным типам ошибки - PullRequest
0 голосов
/ 23 мая 2019

Я хочу расширить родительский класс, сказать:

@Getter
@Builder
public class Parent {

@Builder.default
private final int maxCats = 1;

@NonNull
private final String catName;
}

Я поступаю следующим образом,

@Getter
@ToString
@Builder
public class child extends Parent{

@Builder.default
private final int maxCats = 100;

@NonNull
private final String catName;

@Builder.Default
private final int maxDogs = 500;
}

Когда я собираю пакет, я получаю следующую ошибку:

error: constructor Parent in class Parent cannot be applied to given types;
[javac] @Builder
[javac] ^
[javac]   required: int,String
[javac]   found: no arguments
[javac]   reason: actual and formal argument lists differ in length

Может кто-нибудь помочь мне выяснить причину ошибки?

P.S: Родительский класс не должен быть изменен.

1 Ответ

1 голос
/ 24 мая 2019

@Builder плохо работает с наследованием. Он использует сгенерированный конструктор, который всегда вызывает конструктор по умолчанию суперкласса. Этого не существует в вашем случае.

Если вы в порядке с использованием экспериментальных функций, попробуйте @SuperBuilder. Однако эта аннотация необходима для обоих классов, поэтому нет способа избежать изменения Parent. Кроме того, @SuperBuilder еще не поддерживается в IntelliJ.

В качестве альтернативы вы могли бы написать конструктор вручную со всеми полями в качестве параметров (в том числе и из суперкласса) и поместить в него @Builder. (Примечание: в этом случае избегайте @Builder.Default, так как это удаляет инициализаторы поля.)

...