Consideremos la clase base:
package base; public abstract class Base { protected enum BaseEnum { FIRST, SECOND, THIRD } }Y su subclase:
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; } } } Cuando intento compilarlo, aparece un error de compilación en línea con la declaración de cambio en xxx() que dice:
java: base.Base.BaseEnum.values() is defined in an inaccessible class or interface
Brevemente, la pregunta es ¿qué está pasando exactamente aquí? ¿Por qué values() incluso se llaman aquí? Si realmente se llama, ¿por qué es inaccesible? Como puede ver, puedo acceder correctamente a BaseEnum y sus miembros desde esta clase (ver xxx2() ) e incluso el método de values() (que es un método público de enumeración anidada protegida dentro de la superclase InnerA , ver xxx3() ). ¿Se calcula el acceso como si este interruptor estuviera dentro de la clase A ? Si es así, ¿por qué?
Esto se planteó como un error bugs.openjdk.java.net/browse/JDK-8178701 pero no ha recibido comentarios de los mantenedores de Java, por lo que puedo ver. Entonces, no está claro si se considera un error válido.
Posibles soluciones:
La primera solución que encontré fue que A tiene que extenderse desde Base, no InnerA. Para que pueda acceder al BaseEnum protegido en su clase interna InnerA.
La segunda solución es simplemente hacer público el BaseEnum.
¿Por qué esto es tan?
La declaración de cambio es el problema, como supuso en su pregunta. Pero no tengo ni idea ni encontré algo por qué esto es un problema para que la declaración de cambio cambie a través de una enumeración protegida en esta constelación.