我的代码如下

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,因为SubClassSuperClass的内部类,否则,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,答案已使用该信息更新。

10-04 20:26
查看更多