enumでインターフェースの実装は可能のようだ。
enumは継承できない。
enum Base {
HELLO
}
enum Sub extends Base {
WORLD
}
Test0.java:7: '{' がありません。
enum Sub extends Base {
じゃEnum<?>で統一的に、
enum Base {
HELLO
}
enum Sub {
WORLD
}
public class Test1 {
static void foo(Enum<?> e) {
if (e == Base.HELLO) {
System.err.println("Hello");
}
else if (e == Sub.WORLD) {
System.err.println("World");
}
}
public static void main(String[] args) {
foo(Base.HELLO);
foo(Sub.WORLD);
}
}
Test1.java:13: 型 java.lang.Enum<capture of ?> と Base は比較できません。
if (e == Base.HELLO) {
Objectで受ければいいんだけど、そうすると何でも渡せちゃうしな〜、と思ったら、言語仕様書第三版を見ると、
EnumDeclaration: ClassModifiers(opt) enum Identifier Interfaces(opt) EnumBodyなので、インターフェースを実装するのはokなのか。
interface HelloWorld {
}
enum Base implements HelloWorld {
HELLO
}
enum Sub implements HelloWorld {
WORLD
}
public class Test2 {
static void foo(HelloWorld e) {
if (e == Base.HELLO) {
System.err.println("Hello");
}
else if (e == Sub.WORLD) {
System.err.println("World");
}
}
public static void main(String[] args) {
foo(Base.HELLO);
foo(Sub.WORLD);
}
}
これならok。
$ java -cp . Test2 Hello Worldswitch文が使えないのが口惜しいけど、あれはordinalを利用しているものだから、別クラスにしてしまったらswitchサポートしたって内部的にはelse ifで実装せざるを得ないだろう。
あ、そうか。継承を許すとordinalの処理が面倒になるな。継承enumが作成された後に、親enumに定数が加えられてしまって継承enumの再コンパイル無しに実行されてしまうと、ordinalがダブって奇妙な動きを引き起こしてしまいそうだ。それでサポートされていないのかな。





