枚举值实际上是枚举本身的子类吗?

ast*_*eri 3 java enums class

所以我遇到了一些非常有用的东西.在一个方法中,enum您可以定义一个abstract方法,enum强制每个值为其提供实现.例如,以下内容:

public enum Test {

    RAWR ("Burninating the country side") {
        @Override
        public int doStuff() {
            return 0;
        }
    };

    private final String enumStuff;

    private Test(String enumStuff) {
        this.enumStuff = enumStuff;
    }

    public abstract int doStuff();

}
Run Code Online (Sandbox Code Playgroud)

我添加了私有变量,因此您可以看到它与标准private构造函数的关系.

所以这让我想知道:RAWR实际上,与Test班级相关的是什么?通常,这种语法会让我觉得我正在定义一个匿名的内部类,但这里看起来并不直观,因为RAWR它不是匿名的.

我能想到的最接近的事情是,a的值enum实际上是对enum自身的扩展,例如,

public class RAWR extends Test {
    @Override
    public int doStuff() {
        return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

那么,有谁知道这是怎么回事?

Sot*_*lis 7

来自JLS

枚举声明指定一个新的枚举类型,一种特殊的类类型.

[...]

枚举常量的可选类体隐式定义了一个匿名类声明(第15.9.5节),该声明扩展了直接封闭的枚举类型.

该JLS还规定

对于c在声明体中声明的每个枚举常量E, E都有一个隐式声明public static final field的类型E与其具有相同的名称c.该字段有一个变量初始值设定项,由c与之相同的注释组成,并注释c.

enum您声明的类型是Test.你声明的每个枚举常量都是子类的实例Test,如果它有一个主体.

请注意,enum类型也是隐式的final(您无法将它们子类化).Java语言仅允许枚举常量的子类化行为.

  • 这意味着`enum`值已经是一个类了,对吧?否则就不可能创建一个匿名类.我是对的,这些值扩展了基础`enum`类? (2认同)