枚举的各个值是否可以实现接口

Tro*_*els 4 java enums

一个enum可以实现一个接口。某些值是否可以实现接口?我正在考虑的用例是一个标记接口,因此类似于以下内容:

interface Foo {}
interface Bar {}

enum Widgets {
  FOO implements Foo,
  BAR_1 implements Bar,
  BAR_2 implements Bar
}
Run Code Online (Sandbox Code Playgroud)

这不能在 Java 1.8 下编译。我知道在内部,为 FOO 和 BAR_1 创建了单独的类,所以这似乎是可能的,但我可以很容易地看到标准不支持它。

应该工作的类似的东西是

interface Widgets;
enum Foo implements Widgets { FOO };
enum Bar implements Widgets { BAR_1, BAR_2 };
Run Code Online (Sandbox Code Playgroud)

这有一个缺点,我不能只做Widgets.values()并获得所有的小部件。

Sot*_*lis 6

Java语言规范状态

枚举常量的可选类主体隐式定义了一个匿名类声明(第 15.9.5 节),该声明扩展了直接封闭的枚举类型。类主体由匿名类的通常规则管理;特别是它不能包含任何构造函数。只有当它们覆盖封闭枚举类型中的可访问方法(第 8.4.8 节)时,才可以在封闭枚举类型之外调用在这些类主体中声明的实例方法。

匿名类只能扩展(或实现)在新实例创建表达式中指定的enum类型,在本例中为您的类型。因此,您不能让它另外实现一个接口。


下列

enum Foo {
    CONSTANT
}
Run Code Online (Sandbox Code Playgroud)

被编译成类似于

class Foo extends Enum<Foo> {
    private Foo() {/* calling Enum superconstructor */}
    public static final Foo CONSTANT = new Foo();
}
Run Code Online (Sandbox Code Playgroud)

如果您希望常量具有主体(覆盖或声明某些方法)

enum Foo {
    CONSTANT {
        public String toString() {
            return name().toUpperCase();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

变得像

class Foo extends Enum<Foo> {
    private Foo() {/* calling Enum superconstructor */}
    public static final Foo CONSTANT = new Foo() { // no way to express an additional interface
        public String toString() {
            return name().toUpperCase();
        }
    };
}
Run Code Online (Sandbox Code Playgroud)