我们可以在匿名类中声明枚举吗?
我写了一个示例程序,令人惊讶的是一个空的枚举,在匿名类编译中没有任何枚举常量,但枚举常量并不是枚举。
以下程序会显示错误消息
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。
我不理解这种行为背后的理性。由于枚举类是隐式静态的,所以它们不应该被允许在匿名或本地类中,但是在这里它只允许空的枚举类。
答案 0 :(得分:5)
您不能在匿名类中包含枚举类型。
这是因为匿名类是内部类(JLS 15.9.5):
匿名类始终是内部类(第8.1.3节)
和枚举类型不能在内部类(JLS 8.9)中声明:
Eclipse(使用Mars 4.5.1测试)给出了两种情况的编译错误(在匿名类中有和没有常量的枚举)但似乎嵌套枚举类型隐式
static
。允许声明嵌套枚举类型以冗余地指定static
修饰符。这意味着不可能在内部类的主体中声明枚举类型(第8.1.3节),因为除了常量之外,内部类不能有
static
个成员变量。
javac
(用1.8.0_51测试)只给出了一个编译枚举为常量时的错误,当枚举为空时编译正确;所以看起来javac
中有一个错误。