<< enumって継承できないのか。 | Home | 富久 >>
PR: 転職    お墓    エコ    通販    結婚相談所    シルバー    質屋    葬式    漫画    エステサロン   

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
World
switch文が使えないのが口惜しいけど、あれはordinalを利用しているものだから、別クラスにしてしまったらswitchサポートしたって内部的にはelse ifで実装せざるを得ないだろう。
あ、そうか。継承を許すとordinalの処理が面倒になるな。継承enumが作成された後に、親enumに定数が加えられてしまって継承enumの再コンパイル無しに実行されてしまうと、ordinalがダブって奇妙な動きを引き起こしてしまいそうだ。それでサポートされていないのかな。




コメント追加 トラックバック送信
このサイトの掲載内容は私自身の見解であり、必ずしもIBMの立場、戦略、意見を代表するものではありません。
日本アイ・ビー・エム 花井 志生 Since 1997.6.8