我们可以在匿名类中声明枚举吗?
我写了一个示例程序,令人惊讶的是一个空的枚举,在匿名类编译中没有任何枚举常量,但枚举常量枚举不会.
程序下面给出了错误信息
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,程序编译.
我不理解这种行为背后的理性.由于enum类是隐式静态的,因此不应该允许在匿名或本地类中使用,但是在这里它只允许空的枚举类.
您不能在匿名类中包含枚举类型.
这是因为匿名类是内部类(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进行测试)只给出枚举时的情况的编译错误当枚举为空时,一个常数并编译好; 所以看起来有一个bug javac
.