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

时间:2010-12-24 08:09:39

标签: 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()
     }

}

此处enum A的层次结构从abstract java.lang.Enum延伸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());

4 个答案:

答案 0 :(得分:9)

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

  

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

Java Language Specification第8.9节

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

答案 1 :(得分:7)

来自枚举的Java Tutorial

  

所有枚举都隐式扩展   java.lang.Enum中。既然Java没有   支持多重继承,一个枚举   不能扩展其他任何东西。

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

答案 2 :(得分:1)

事实上,您无法将enum声明为扩展另一个类。因此,super只有一个enum构造函数。

我想,既然你不能链接到super()以外的任何东西,他们认为在super构造函数中根本不允许使用enum

无论哪种方式,你都不会失去任何东西。

答案 3 :(得分:1)

因为没有super()构造函数,请参阅dogbane的答案,因为编译器会自动插入所需的super(...)调用,同上。

为什么这是一个问题?