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());
答案 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(...)调用,同上。
为什么这是一个问题?