在匿名类中声明枚举

时间:2015-12-10 09:50:57

标签: java enums

我们可以在匿名类中声明枚举吗?

我写了一个示例程序,令人惊讶的是一个空的枚举,在匿名类编译中没有任何枚举常量,但枚举常量并不是枚举。

以下程序会显示错误消息

  

Main.java:16:错误:非静态变量,无法从静态上下文引用               obj.no(new a(){enum e {j}});

/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class a {}
class Ideone
{
    public void no(a arg) {;} ;
    public static void main (String[] args) throws java.lang.Exception
    {
        // your code goes here
        Ideone obj = new Ideone();
        obj.no(new a() { enum e{j,k;} });


    }
}

程序编译,如果我删除枚举常量j和k。

我不理解这种行为背后的理性。由于枚举类是隐式静态的,所以它们不应该被允许在匿名或本地类中,但是在这里它只允许空的枚举类。

1 个答案:

答案 0 :(得分:5)

您不能在匿名类中包含枚举类型。

这是因为匿名类是内部类(JLS 15.9.5):

  

匿名类始终是内部类(第8.1.3节)

和枚举类型不能在内部类(JLS 8.9)中声明:

  

嵌套枚举类型隐式static。允许声明嵌套枚举类型以冗余地指定static修饰符。

     

这意味着不可能在内部类的主体中声明枚举类型(第8.1.3节),因为除了常量之外,内部类不能有static个成员变量。

Eclipse(使用Mars 4.5.1测试)给出了两种情况的编译错误(在匿名类中有和没有常量的枚举)但似乎javac(用1.8.0_51测试)只给出了一个编译枚举为常量时的错误,当枚举为空时编译正确;所以看起来javac中有一个错误。