我偶然发现以下内容无法在Eclipse中编译:
enum Empty {
;
abstract void foo();
}
JLS似乎验证了这种行为:
如果枚举声明E有一个
abstract
方法m
作为成员,那么这是一个编译时错误,除非E至少有一个枚举常量,并且所有E的枚举常量都有类主体提供m
的具体实现。
我想知道这背后的原因是什么。为什么不将空枚举视为没有现有实现的抽象类?
答案 0 :(得分:2)
正如您所正确指出的那样,规范要求您在这种情况下至少有一个枚举常量。那是因为与通常没有现有实现枚举的抽象类不同,它不能在其他地方实现,因此这种抽象方法变得完全没用。
对于通常的抽象类,稍后可以从其他源加载实现,编译器无法知道这一点。但是对于枚举编译器非常肯定没有实现,所以没有理由声明这样的方法。