Расширение enum - PullRequest
       12

Расширение enum

3 голосов
/ 26 ноября 2008
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 ]

5 голосов
/ 26 ноября 2008

Ваш класс myEnum наследуется от java.lang.Enum. VAL3 - это анонимный внутренний класс, который наследуется от myEnum с именем myEnum $ 1. Думайте о ключевом слове enum как о синтетическом сахаре. Он устанавливает классы с обычными деревьями наследования для вас, но не позволит вам напрямую расширять java.lang.Enum или myEnum.

0 голосов
/ 26 ноября 2008

от декомпилятора


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);
    }


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...