<< 2005/12/28 | Home | 2005/12/30 >>
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がダブって奇妙な動きを引き起こしてしまいそうだ。それでサポートされていないのかな。

enumって継承できないのか。

将来拡張したい定数群は、どうすればいいんだろう。

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