根据JLS:
枚举类型是隐式最终的,除非它包含至少一个具有类主体的枚举常量。
在您的示例中,
VALUE具有类主体,因此
E不是隐式最终的。
编辑: 这是一个验证索赔的快速示例:
import java.lang.reflect.Modifier;public class Sandbox { public enum E { VALUE {}; } public enum E2 { VALUE; } public static void main(String[] args) { System.out.println(E.class); System.out.println(E.VALUE.getClass()); System.out.println("E.VALUE is subclass of E = " + E.VALUE.getClass().getSuperclass().equals(E.class)); System.out.println("E modifiers: " + Modifier.toString(E.class.getModifiers())); System.out.println("E2 modifiers: " + Modifier.toString(E2.class.getModifiers())); }}从输出中可以看到,编译器正在将
final修饰符添加到,
E2但没有
E:
class Sandbox$Eclass Sandbox$E$1E.VALUE is subclass of E = trueE modifiers: public staticE2 modifiers: public static final
编辑#2: 即使
E是 不
final和由子类
VALUE,明确地试图把它扩大,如用
class Foo extendsE或者
enum Bar extendsE是根据编译时错误8.1.4。超类和子类:
如果ClassType将该类命名为Enum或对其进行任何调用,则是编译时错误。



