一个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()并获得所有的小部件。
在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)
| 归档时间: |
|
| 查看次数: |
733 次 |
| 最近记录: |