扩展枚举

时间:2008-11-26 03:50:23

标签: java inheritance enums

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')

但是编译器如何创建一个扩展myEnum的子类型枚举,因为所有的枚举都已经扩展了java.lang.enum?

2 个答案:

答案 0 :(得分:5)

您的类myEnum继承自java.lang.Enum。 VAL3是一个匿名内部类,它继承自myEnum,名为myEnum $ 1。将enum关键字视为合成糖。它为您设置具有普通继承树的类,但不允许您直接扩展java.lang.Enum或myEnum。

答案 1 :(得分: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);
    }


}