最近看了下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子类吗?这个难道也是编译机搞的事情???
其中有两条:泛型和枚举,本来觉得没什么的。自己写了测试程序,发现枚举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子类吗?这个难道也是编译机搞的事情???
解决方案 »
- 帮我解决了换行的问题!谢谢大家!
- 关于myEclipse设置package的问题,送分,在线等
- 请问,JAVA与NET哪个容易学些?
- 高分求助在线等:java的application程序可以获得本机的机器名么?
- DEP2是什么文件类型啊?是怎么生成的,有什么用,怎样打开他它?高手帮忙!谢谢!
- 各位给个意见
- 请教关于画图时的显示问题!!
- 请问怎样将从数据库里查询到的记录显示在已有的jtable上?高分求助,望高手拉我一把,十万分谢谢!
- 初学java,问:main(String[] arguments){...}中主函数的两个参数的意思
- 终于有颗星散分500
- 退出循环语句
- j2se 怎么把图片切割成相同宽高几个小图片?
public final class Color extends Enum<Color>
这个好像不可行。
而相同定义的类Enum2的话,
public final class Color extends Enum2<Color>
这种是可行的。
类似以前的:
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;
}
}
若是nb的话、可以写一个编译器编译继承自Enum的代码。