3

我无意中发现以下内容无法在 Eclipse 中编译:

enum Empty {
    ;
    abstract void foo();
}

JLS似乎验证了这种行为:

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

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

4

1 回答 1

2

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

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

于 2015-11-12T06:22:07.297 回答