JDK1.5的泛型与枚举

sytu_ckx 2010-12-08 05:07:23
最近看了下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子类吗?这个难道也是编译机搞的事情???
...全文
157 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sytu_ckx 2010-12-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 curbstone119 的回复:]

意义何在???

enmu是1.5新加的东西,实际上编译的时候还是按照类继承的方式运行的
类似以前的:
Java code
public class TestEnum {
public static TestEnum A = new TestEnum("a");
public static TestEnum B = new TestEnum("a");
publ……
[/Quote]
要问的问题看懂了吗?
curbstone119 2010-12-09
  • 打赏
  • 举报
回复
意义何在???

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;
}
}
sytu_ckx 2010-12-09
  • 打赏
  • 举报
回复
有满意答案的话,还怕不结贴啊。
sytu_ckx 2010-12-09
  • 打赏
  • 举报
回复
总共只发了两个帖啊,大哥。
Jlins 2010-12-09
  • 打赏
  • 举报
回复
你都不结贴 谁愿意回复你呀
「已注销」 2010-12-09
  • 打赏
  • 举报
回复
编译器帮你干活,你嫌麻烦,非要自己把简单的代码往复杂写。

真是智能的编译器呀
sytu_ckx 2010-12-09
  • 打赏
  • 举报
回复
没人回复啊。
自己顶上去。
24K純帥 2010-12-09
  • 打赏
  • 举报
回复
LS高见。。
huntor 2010-12-09
  • 打赏
  • 举报
回复
枚举就是一语法糖、编译器限制你不能写一段自己继承 Enum的代码。
若是nb的话、可以写一个编译器编译继承自Enum的代码。
sytu_ckx 2010-12-08
  • 打赏
  • 举报
回复
第二个问题的关键是问:
public final class Color extends Enum<Color>

这个好像不可行。
而相同定义的类Enum2的话,
public final class Color extends Enum2<Color>

这种是可行的。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧