プロジェクトにロンボクを使用しようとしていました。
私はクラスAを持っています:
@Data
@Builder
public class A {
Integer a1;
}
そしてクラスB:
@Data
public class B extends A {
Integer b1;
@Builder
public B(Integer b1, Integer a1) {
super(a1);
this.b1 = b1;
}
}
BBuilderの戻り値の型はABuilderの戻り値の型と互換性がないため、Bのbuilder()はAのbuilder()をオーバーライドできないというエラーが表示されます。
ロンボクを使用してこれを行う方法はありますか?他のオプションがない限り、Bの完全なビルダーを記述したくありません。
PS: Issue のため、クラスBに明示的なコンストラクターを指定しました。検索してみましたが、良い解決策が見つかりませんでした。
ここでは、ビルダーのスーパーを呼び出す必要があります。
@Data
public class B extends A {
Integer b1;
@Builder
public B(Integer b1, Integer a1) {
super(a1);
this.b1 = b1;
}
public static class BBuilder extends ABuilder{
BBuilder() {
super();
}
}
}
Lombokは、バージョン1.18.2の実験的機能を導入しました。ビルダーアノテーションで直面する継承の問題に対応し、@ SuperBuilderアノテーションで解決できます。
ロンボクバージョンを使用してください:1.18.2、子/親クラスの@SuperBuilderアノテーション
Lombok 1.18.4をIntelliJと共に使用している場合は、次のコードが機能します。
@Data
@Builder
class A {
Integer a1;
}
@Data
class B extends A {
Integer b1;
@Builder (builderMethodName = "BBuilder")
public B(Integer b1, Integer a1) {
super(a1);
this.b1 = b1;
}
}
public class Main {
public static void main(String[] args){
System.out.println(B.BBuilder().a1(1).b1(1).build());
}
}
余談ですが、この回答を書いている時点では、@ SuperBuilderアノテーションはIntelliJでは機能しませんでした。複数レベルの継承がある場合は、Lombokを使用しないでください。回避すると、Javaモデルが乱雑になります。