在切换枚举时,SomeEnum.values() 在不可访问的类或接口中定义

Kir*_*ski 7 java enums

让我们考虑一下基类:

package base;

public abstract class Base {
    protected enum BaseEnum {
        FIRST, SECOND, THIRD
    }
}
Run Code Online (Sandbox Code Playgroud)

及其子类:

package a;

import base.Base;

public class A {
    // The error message appears in case when NestedA is a nested or inner class
    protected /* static */ class InnerA extends Base {
        protected BaseEnum getEnumA() {
            return BaseEnum.FIRST;
        }

        protected int xxx() {
            BaseEnum enumA = getEnumA();
            switch (enumA) {
            // ^^ base.NestedBase.BaseEnum.values() is defined in an inaccessible class or interface
                case FIRST:
                case SECOND:
                    return 1;
                default:
                    return 2;
            }
        }

        protected int xxx2() {
            BaseEnum enumA = getEnumA();
            if (enumA == BaseEnum.FIRST || enumA == BaseEnum.SECOND) {
                return 1;
            } else {
                return 2;
            }
        }

        protected int xxx3() {
            System.out.println(BaseEnum.values());
            return 2;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译它时,编译错误出现在 switch 语句中,内容如下xxx()

java: base.Base.BaseEnum.values() is defined in an inaccessible class or interface

简而言之,问题是这里到底发生了什么?为什么values()还叫这里呢?如果真的调用了,为什么访问不到呢?正如您所看到的,我可以正确访问BaseEnum此类及其成员(请参阅xxx2()),甚至values()方法(这是超类内受保护的嵌套枚举的公共方法InnerA,请参阅xxx3())。是否按照此开关位于A类内部的方式计算访问权限?如果是这样,为什么?

tgd*_*ies 4

这已作为 bugs.openjdk.java.net/browse/JDK-8178701 提出,但据我所知,尚未收到 Java 维护人员的反馈。因此,尚不清楚它是否被视为有效的错误。