J'ai 2 classes:
import lombok.Builder;
@Builder
public class B extends A {
}
et
import lombok.Builder;
@Builder
public class A {
}
sur le @Builder
sur B
je reçois le message:
Le type de retour est incompatible avec A.builder ().
Est-ce une limitation de lombok? ou quelque chose que je fais mal?
Si je laisse le @Builder
sur A
, le générateur de B
ne semble pas prendre en compte les champs de A
dans les constructeurs pour B
.
La dernière version 1.18.2 de Lombok inclut le nouveau @SuperBuilder
expérimental . Il supporte l'héritage et les champs des superclasses (aussi abstraits). La seule exigence est que toutes les super-classes doivent avoir l'annotation @SuperBuilder
. Avec elle, la solution est aussi simple que cela:
@SuperBuilder
public class B extends A {
private String b;
}
@SuperBuilder
public class A {
private String a;
}
B instance = B.builder().b("b").a("a").build();
Cela n’est possible qu’avec une solution de contournement ( voir n ° 78 )
Nous utilisons @Builder sur la classe elle-même, mais vous pouvez également le placer sur le constructeur d’une classe ou sur une méthode statique. Dans ce cas, Lombok créera une méthode de définition sur la classe de générateur pour chaque paramètre du constructeur/méthode. Cela signifie que vous pouvez créer un constructeur personnalisé avec des paramètres pour tous les champs de la classe, y compris sa super-classe.
@AllArgsConstructor
public class Parent {
private String a;
}
public class Child extends Parent {
private String b;
@Builder
private Child(String a, String b){
super(a);
this.b = b;
}
}
Je ne peux plus reproduire votre problème exact, mais c'est peut-être parce que Lombok a évolué.
Une partie de votre question, cependant, était que le constructeur pour être n'inclut pas les champs pour a. Cela reste vrai, de même que pour @AllArgsConstructor
. L’héritage n’est pas l’atout majeur de Lombok.
Thad a dit, puisque vous pouvez écrire votre constructeur vous-même et mettre @Builder
sur le constructeur, ce qui suit va générer un constructeur pour B comme vous le souhaitez:
@Builder
public class A {
String a;
}
public class B extends A {
@Builder
B(String a, String b) {
super(a);
this.b = b;
}
String b;
}