我有以下课程:
@SuperBuilder(toBuilder = true)
public abstract class Parent {
//...
}
@SuperBuilder(toBuilder = true)
public class Child extends Parent {
//...
}
@SuperBuilder(toBuilder = true)
public class Child2 extends Parent {
//...
}
为什么我不能对抽象类( toBuilder()
)的实例调用Parent
,如下面的代码所示?
public copy(Parent parent) {
parent.toBuilder().build();
}
发布于 2020-05-06 22:10:25
事实上,作为Hossein Nasr already explained,Lombok无法知道是否存在没有toBuilder=true
的子类。
通过在抽象类上添加一个toBuilder
方法,Lombok可以要求抽象类的所有直接子类也使用abstract toBuilder()
。但是,可能存在子类不应该有toBuilder
的用例(尽管我还没有看到任何好的例子)。此外,间接子类可能仍然缺乏toBuilder
特性。因此,lombok不对抽象类的子类强制执行toBuilder
。
好消息是,通过手动将abstract toBuilder()
方法添加到abstract class Parent
中,您可以轻松地在您的情况下处理它(只有直接子类):
@SuperBuilder(toBuilder = true)
public abstract class Parent {
public abstract ParentBuilder<?, ?> toBuilder();
}
通过此更改,您的copy
方法将按预期的方式编译和工作。
如果您也有间接子类,则必须找到其他方法来确保它们也有@SuperBuilder(toBuilder = true)
。如果没有这个注释,您可能会遇到奇怪的行为(例如,调用copy()
将实例化一个不同的类)。
免责声明:我实现了@SuperBuilder
特性。
发布于 2020-05-06 03:21:52
这可能是因为Lombok不能保证Parent
的每个子类也被标记为@SuperBuilder(toBuilder=true)
,如果是的话,Lombok不能调用该实例的toBuilder
;
https://stackoverflow.com/questions/61633821
复制