3
public enum myEnum {    
VAL1(10), VAL2(20), VAL3("hai") {
        public Object getValue() {
            return this.strVal;
        }
        public String showMsg() {
            return "This is your msg!";
        }
    };
    String strVal;
    Integer intVal;
    public Object getValue() {
        return this.intVal;
    }
    private myEnum(int i) {
        this.intVal = new Integer(i);
    }
    private myEnum(String str) {
        this.strVal = str;
    }
}

上記の列挙型で、VAL3 の定数固有のクラス本体を追加すると、正確にはどうなりますか?

VAL3 の型は、オーバーロードされたメソッドと追加のメソッドがあるため、明らかに myEnum のサブタイプです。(クラス型は 'myEnum$1' になります)

しかし、すべての列挙型が既に java.lang.enum を拡張しているため、コンパイラは myEnum を拡張するサブタイプの列挙型をどのように作成できますか?

4

2 に答える 2

5

クラス myEnum は java.lang.Enum を継承しています。VAL3 は、myEnum$1 という名前の myEnum から継承する匿名の内部クラスです。enum キーワードをシンタックス シュガーと考えてください。通常の継承ツリーを持つクラスをセットアップしますが、java.lang.Enum または myEnum を直接拡張することはできません。

于 2008-11-26T04:08:16.417 に答える
0

逆コンパイラから


package com.sun.tools.xjc.outline;


public final class Aspect extends Enum
{
    public static final Aspect EXPOSED;
    public static final Aspect IMPLEMENTATION;
    private static final Aspect $VALUES[];

    static 
    {
        EXPOSED = new Aspect("EXPOSED", 0);
        IMPLEMENTATION = new Aspect("IMPLEMENTATION", 1);
        $VALUES = (new Aspect[] {
            EXPOSED, IMPLEMENTATION
        });
    }

    public static final Aspect[] values()
    {
        return (Aspect[])$VALUES.clone();
    }

    public static Aspect valueOf(String name)
    {
        Aspect arr$[] = $VALUES;
        int len$ = arr$.length;
        for(int i$ = 0; i$ < len$; i$++)
        {
            Aspect aspect = arr$[i$];
            if(aspect.name().equals(name))
                return aspect;
        }

        throw new IllegalArgumentException(name);
    }

    private Aspect(String s, int i)
    {
        super(s, i);
    }


}
于 2008-11-26T09:34:48.817 に答える