为什么不能从枚举构造函数中调用超级构造函数?

9 java reflection enumeration superclass

public enum A {
     A(1);

     private A(int i){
     }

     private A(){
         super(); // compile - error
             // Cannot invoke super constructor from enum constructor A()
     }

}
Run Code Online (Sandbox Code Playgroud)

这是enum Aabstract java.lang.Enumextends扩展的层次结构java.lang.Object

Class c = Class.forName("/*path*/.A");
System.out.println(c.getSuperclass().getName());
System.out.println(Modifier.toString(c.getSuperclass().getModifiers()).contains("abstract"));
System.out.println(c.getSuperclass().getSuperclass().getName());
Run Code Online (Sandbox Code Playgroud)

Hen*_*ann 9

Enums在编译器和运行时级别意味着很多魔力,以保证==比较将始终有效:

尝试显式实例化枚举类型(第15.9.1节)是编译时错误.Enum中的最终克隆方法确保永远不会克隆枚举常量,并且序列化机制的特殊处理可确保不会因反序列化而创建重复实例.禁止对枚举类型进行反射实例化.总之,这四件事确保除了枚举常量定义的实例之外不存在枚举类型的实例.

Java语言规范部分8.9

没有无参数的Enum()构造函数,只有Enum(String name,int ordinal).但允许用错误的参数调用那个显然会带来麻烦.


dog*_*ane 7

来自Enums上的Java教程:

所有枚举都隐式扩展了java.lang.Enum.由于Java不支持多重继承,因此枚举不能扩展其他任何内容.

您无法调用super()构造函数,因为编译器会自动将隐藏调用插入super(name, ordinal)到您定义的任何构造函数中.