为什么空枚举不能有抽象方法?

时间:2015-11-12 06:17:46

标签: java enums abstract-class jls abstract-methods

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

enum Empty {
    ;
    abstract void foo();
}

JLS似乎验证了这种行为:

  

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

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

1 个答案:

答案 0 :(得分:2)

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

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