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