我的代码如下
package test.lombok;
import lombok.*;
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
public class SuperClass {
private int foo;
@Getter
public static class SubClass extends SuperClass {
private int bar;
@Builder(toBuilder = true)
private SubClass(int foo, int bar) {
super(foo);
this.bar = bar;
}
}
}
如上所示,我试图在子类上使用@Builder(toBuilder = true)。
当toBuilder设置为false时,完全没有问题。
但是,当我将toBuilder设置为true时,出现编译错误“Error:java:foo在test.lombok.SuperClass中具有私有(private)访问权限”。
我想知道为什么会这样以及如何解决这个问题。
最佳答案
问题是因为在toBuilder
中如何实现SubClass
方法:
public SuperClass.SubClass.SubClassBuilder toBuilder() {
return (new SuperClass.SubClass.SubClassBuilder()).foo(this.foo).bar(this.bar);
}
而不是
this.foo
,它应该是super.foo
,并且代码可以编译。在这种情况下,可以访问super.foo
,因为SubClass
是SuperClass
的内部类,否则,Java也将禁止super.foo
。如果您想亲自查看lombok生成的代码,请将
foo
声明为public,然后进行编译,然后进行delombok(或反编译),您将看到类似这样的代码(然后将属性更改为private,以查看发生错误的位置):import java.beans.ConstructorProperties;
public class SuperClass {
public int foo;
@ConstructorProperties({"foo"})
protected SuperClass(int foo) {
this.foo = foo;
}
public int getFoo() {
return this.foo;
}
public static class SubClass extends SuperClass {
private int bar;
private SubClass(int foo, int bar) {
super(foo);
this.bar = bar;
}
public static SuperClass.SubClass.SubClassBuilder builder() {
return new SuperClass.SubClass.SubClassBuilder();
}
public SuperClass.SubClass.SubClassBuilder toBuilder() {
return (new SuperClass.SubClass.SubClassBuilder()).foo(this.foo).bar(this.bar);
}
public int getBar() {
return this.bar;
}
public static class SubClassBuilder {
private int foo;
private int bar;
SubClassBuilder() {
}
public SuperClass.SubClass.SubClassBuilder foo(int foo) {
this.foo = foo;
return this;
}
public SuperClass.SubClass.SubClassBuilder bar(int bar) {
this.bar = bar;
return this;
}
public SuperClass.SubClass build() {
return new SuperClass.SubClass(this.foo, this.bar);
}
public String toString() {
return "SuperClass.SubClass.SubClassBuilder(foo=" + this.foo + ", bar=" + this.bar + ")";
}
}
}
}
编辑:感谢@maaartinus将我指向
super.foo
,答案已使用该信息更新。