以下是一组类。
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 方法,这就会消失。
我如何进行这项工作?
对于泛型类,lombok 会生成一个generic 构建器类。毕竟,构建器如何知道它正在构建的类型具有哪些类型参数,否则呢?构建器类是静态的,所以它不能访问外部类中声明的类型参数。
你可能知道,如果你自己声明匹配名称的构建器类,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) {
// ...