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

问题描述 投票:0回答:1

以下是一组类。

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 方法,这就会消失。

我如何进行这项工作?

java lombok
1个回答
1
投票

对于泛型类,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) {
        // ...
© www.soinside.com 2019 - 2024. All rights reserved.