最近看了下jdk1.5比jdk1.4的新特性。
其中有两条:泛型和枚举,本来觉得没什么的。自己写了测试程序,发现枚举enum会有个values()方法,
【还有个valueOf(String name)方法-->暂不讨论】。在Enum类中,找不到定义,网上查了下资料,
values()方法是编译机自动加进去的。源代码:public enum Color {
Red, Green, Blue;
}
编译成class文件后,
试着用JAD工具,反编译了下class文件,
反编译的代码:// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3) 
// Source File Name:   Color.java
public final class Color extends Enum
{    private Color(String s, int i)
    {
        super(s, i);
    }    public static Color[] values()
    {
        Color acolor[];
        int i;
        Color acolor1[];
        System.arraycopy(acolor = ENUM$VALUES, 0, acolor1 = new Color[i = acolor.length], 0, i);
        return acolor1;
    }    public static Color valueOf(String s)
    {
        /*
         * 自己注释:此处会报错。
         * 因为Enum的方法,public static <T extends Enum<T>> T valueOf(...
         * T必须为Enum的子类。
         */
        return (Color)Enum.valueOf(Color, s);
    }    public static final Color Red;
    public static final Color Green;
    public static final Color Blue;
    private static final Color ENUM$VALUES[];    static 
    {
        Red = new Color("Red", 0);
        Green = new Color("Green", 1);
        Blue = new Color("Blue", 2);
        ENUM$VALUES = (new Color[] {
            Red, Green, Blue
        });
    }
}
发现枚举类enum最后变成了class文件,继承自Enum类,
而且确实有个values()方法。问题。
问题一:搞不懂,这个方法为什么不在Enum类中定义,
        确实是由编译机加进去的吗?
问题二:把反编译的代码,整理下,为了让能改成JAVA代码
        顺利通过编译,要做下修改。
    首先:java源码中Enum定义是:
    public abstract class Enum<E extends Enum<E>>
    所以想将反编译的
    public final class Color extends Enum
    修改成
    public final class Color extends Enum<Color> //(XXX)
    但是这个是怎么都修改不成功。
    接着:写了个测试类
     直接定义了
     
     public abstract class Enum2<E extends Enum2<E>> {
     }
     
    然后将反编译的代码改为
    
    public final class Color extends Enum2<Color>
     
     这个可以成功。
    所以:就搞不懂了,难道不能按照(XXX)处的样子,
    声明一个Enum子类吗?这个难道也是编译机搞的事情???

解决方案 »

  1.   

    第二个问题的关键是问:
    public final class Color extends Enum<Color>
    这个好像不可行。
    而相同定义的类Enum2的话,
    public final class Color extends Enum2<Color>
    这种是可行的。
      

  2.   

    意义何在???enmu是1.5新加的东西,实际上编译的时候还是按照类继承的方式运行的
    类似以前的:
    public class TestEnum {
    public static TestEnum A = new TestEnum("a");
    public static TestEnum B = new TestEnum("a");
    public static TestEnum C = new TestEnum("a"); private String myS; private TestEnum(String s) {
    myS = s;
    } @Override
    public String toString() {
    return myS;
    }
    }
      

  3.   

    枚举就是一语法糖、编译器限制你不能写一段自己继承 Enum的代码。
    若是nb的话、可以写一个编译器编译继承自Enum的代码。