我有下面的Lombok@Builder
类,其中我覆盖了一个生成器方法,将输入字符串列表转换为枚举列表(字段barList
(:
(我仍然使用其他字段number
的默认方法(
import java.util.List;
import java.util.stream.Collectors;
import lombok.Builder;
import lombok.Getter;
@Getter
@Builder(toBuilder = true)
public class Foo {
private List<BarEnum> barList;
private int number;
public static class FooBuilder {
private List<BarEnum> barList;
public FooBuilder barList(List<String> barStringList) {
this.barList = barStringList.stream()
.map(barString -> BarEnum.valueOf(barString))
.collect(Collectors.toList());
return this;
}
}
}
在编译时,我在上面的@Builder(toBuilder = true)
行得到了这个错误:
不兼容的类型:java.util.List<com.mypackage.BarEnum>不能已转换为java.util.List<java.lang.String>
我找不到任何可以覆盖默认生成器方法并更改值类型的答案。有可能做到这一点吗?
首先我们运行delombok来更好地了解发生了什么,然后编译输出。
java -jar lombok.jar delombok -p Foo.java >Foo2.java
# Rename Foo2.java or make the `class Foo` declaration non-public
javac Foo2.java
获取我们:
Foo2.java:63: error: incompatible types: List<BarEnum> cannot be converted to List<String>
return new Foo.FooBuilder().barList(this.barList).number(this.number);
^
答案很清楚:Lombok需要构造器barList方法的barList(List<BarEnum>)
变体才能存在。通过自己编写,lombok不会生成自己的版本。
龙目核心开发人员在这里发言:我们没有,因为很难确定是否存在签名冲突。因此,我们注意到一个方法与我们想要生成的东西同名,并且具有相同的参数计数,我们不做任何进一步的分析:这是一个"匹配",意味着lombok不再生成这个方法,假设你已经接管了它的责任,好的例子:除了显式barList(List<String>)
方法之外,不能有barList(List<BarEnum>)
方法,因为不能有两个方法只在参数的泛型部分不同!(试试看,不会编译(。
因此,你在这里的做法根本站不住脚。修复相当简单-使自定义方法类似于:
public FooBuilder barStringList(List<String> barStringList) { .. }
即给它取另一个名字。现在lombok也将生成barList(List<BarEnum>)
,一切都会好起来。
如果你想让barlist(List<BarEnum>)
变体不存在,那就不要存在,但你必须手工编写它的toBuilder()
部分:在这一点上,如果你开始有效地删除作为"setter"所需的方法,lombok就不可能再自动知道如何将实例变成预填充的构建器了。
免责声明:我是一个核心的lombok开发。