Java 为什么可以';空枚举是否有抽象方法?

Java 为什么可以';空枚举是否有抽象方法?,java,enums,abstract-class,jls,abstract-methods,Java,Enums,Abstract Class,Jls,Abstract Methods,我意外地发现以下内容没有在Eclipse中编译: enum Empty { ; abstract void foo(); } 似乎验证了此行为: 如果枚举声明E有一个abstract方法m作为成员,则这是一个编译时错误,除非E至少有一个枚举常量,并且所有E的枚举常量都有提供m具体实现的类主体 我想知道这背后的原因是什么。为什么不将空枚举视为没有现有实现的抽象类?正如您正确指出的,在这种情况下,规范要求您至少有一个枚举常量。这是因为不像通常的抽象类那样没有现有的实现,枚举不能在其

我意外地发现以下内容没有在Eclipse中编译:

enum Empty {
    ;
    abstract void foo();
}
似乎验证了此行为:

如果枚举声明E有一个
abstract
方法
m
作为成员,则这是一个编译时错误,除非E至少有一个枚举常量,并且所有E的枚举常量都有提供
m
具体实现的类主体


我想知道这背后的原因是什么。为什么不将空枚举视为没有现有实现的抽象类?

正如您正确指出的,在这种情况下,规范要求您至少有一个枚举常量。这是因为不像通常的抽象类那样没有现有的实现,枚举不能在其他地方实现,因此这种抽象方法变得完全无用


对于通常的抽象类,实现可以稍后从其他源加载,编译器无法知道这一点。但对于enum编译器来说,它非常确定并没有实现,所以并没有理由声明这样的方法。

从什么时候开始,我们会对无用的代码产生编译错误?即使是未使用的局部变量也只是一个警告。根据您的推理,为什么不将空枚举完全定为非法呢?@shmosel,在java中这是常见的做法。例如,尝试在
return
语句之后或在无尽循环之后编写一些代码。您将获得“无法访问的代码”编译错误。另一个例子是。一般来说,java对无用代码相当严格,与C++等其他语言相比,在未使用的代码和不可访问的代码之间有区别。@ SMOSEL,还有未使用的代码和代码之间的差异,它们根本不能使用,而且毫无意义。不管怎么说,它就是这样被指定的。讨论是否应该以这种方式指定它将导致我们进行基于意见的讨论。这种限制特别愚蠢,因为空枚举中没有实例方法可以调用,所以为什么要选择抽象方法呢?