请建议如何使用@Wither
/@With
当继承应用时。
我有一个抽象类Parent
和混凝土Child
. Child
应该是不可变的。推杆@Wither
两者都给了我两个错误:
- 构造函数 Child(String) 未定义
- Child 类型必须实现继承的抽象方法
Parent.with A(字符串)
@Value
@Wither
@NonFinal
@SuperBuilder
abstract class Parent {
String a;
}
@Value
@Wither
@EqualsAndHashCode(callSuper = true)
@SuperBuilder
class Child extends Parent {
String b;
}
我很乐意删除@Wither
并使用构建器方法,但我正在重构公共库(尝试优化模型类)并且我不希望我的客户端出现编译错误。
我还发现这个问题解释了第二个错误。但意图的逻辑并不清晰https://github.com/rzwitserloot/lombok/issues/945
Lombok 是一个注释处理器。它们在每个编译单元(即 Java 文件)上运行,并且无法访问其他编译单元的信息。这意味着 Lombok 无法知道任何有关类内容的信息Parent
加工时Child
.
所以当生成代码时Child
, Lombok不知道wither方法继承自什么Parent
。因此,它无法生成抽象的实现withA()
from Parent
.
第二个问题是,wither 方法需要一个将所有字段作为参数的构造函数,包括来自超类的字段。由于上述限制,对于 Lombok 来说也是不可能生成的。
使长话短说:@Wither
不能很好地与继承配合使用。我建议只把它放在Parent
并手动实现它Child
.
另一种选择是把@SuperBuilder(toBuilder=true)
在两个类上然后使用instance.toBuilder().a("newValue").build()
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)