java lombok泛型类、构建器模式和自定义setter的语法错误

waxmsbnn  于 2023-03-28  发布在  Java
关注(0)|答案(1)|浏览(141)

下面是一组类。

import lombok.Builder;
import lombok.Data;

import java.util.Collection;
import java.util.Collections;
import java.util.List;

@Data
@Builder
public class GenericClass<T> {

    //Omitted other attributes for brevity.

    private Class<T> elementClazz;

    @SuppressWarnings("rawtypes")
    private Class<? extends Collection> collectionClazz;

    private Collection<String> strings;

    /*BUILDER*/
    public static class GenericClassBuilder {
        public GenericClassBuilder strings(Collection<String> strs) {
            if (strs == null)
                strs = Collections.emptyList();
            this.strings = strs;
            return this;
        }
    }

}

@Data
class SomeClass {
    private int number;
}

class Main {
    public static void main(String[] args) {
        GenericClass.<SomeClass>builder().elementClazz(SomeClass.class).collectionClazz(List.class).build();
    }
}

但是我在.elementClazz(SomeClass.class)中看到了语法错误。但是如果我删除构建器类中的自定义setter方法,这个错误就消失了。
我该怎么做呢?

6bc51xsx

6bc51xsx1#

对于泛型类,lombok将生成一个 generic builder类。毕竟,构建器如何知道它正在构建的类型具有哪些类型参数呢?构建器类是静态的,因此它不能访问外部类中声明的类型参数。
正如你可能知道的,如果你自己用匹配的名字声明了构建器类,lombok将不会再次生成构建器类,而会直接将构建器方法注入到你编写的类中。
但是,由于您的类不是泛型的,因此当Lombok生成包含T的方法时,它将无法编译。
IntelliJ似乎也对elementClazz(SomeClass.class)调用感到困惑,因为elementClazz应该接受Class<T>,但T并不存在,因为构建器不是通用的。因此,它似乎认为T不是SomeClass,而是其他一些随机类型,给你你看到的错误。
简而言之,只需使构建器类成为泛型:

public static class GenericClassBuilder<T> {
    public GenericClassBuilder<T> strings(Collection<String> strs) {
        // ...

相关问题