使用Lombok @SuperBuilder时泛型final子类编译失败求助
问题原因
泛型子类继承泛型父类并使用@SuperBuilder时,Lombok自动生成的构建器在类型推导过程中无法正确关联父类与子类的泛型参数T,导致父类构建器的泛型被错误推断为Object,进而触发类型不匹配的编译错误。
解决方案
提供两种可行的修复方式:
方式一:显式指定构建器泛型参数
调用builder()时显式声明子类的泛型参数,帮助编译器正确推导父类泛型类型:
public class SuperBuilderTest { public static void main(String[] args) { SomeGenericClass<String, Parent<Long>> someGenericClass = new SomeGenericClass<>(); // 显式指定泛型参数<Long> Child<Long> child = Child.<Long>builder() .someGenericClass(someGenericClass) .value(10L) .build(); } }
方式二:调整父类泛型约束
修改父类中someGenericClass的泛型声明,放宽类型匹配的限制:
@SuperBuilder(toBuilder = true) public abstract class Parent<T> { // 将Parent<T>改为? extends Parent<T> private SomeGenericClass<?, ? extends Parent<T>> someGenericClass; private T value; }
验证说明
当子类不使用泛型参数(直接绑定父类泛型为Long)时,编译器能明确父类的泛型类型,因此不会出现推导错误,代码可正常编译。这也验证了问题核心是泛型参数的自动推导失败。
内容的提问来源于stack exchange,提问作者Melanie Fuchs
相关产品推荐
相关产品推荐

