Java中的enum的使用过程中碰到如下一个问题,代码如下:
public enum RequestType {
AddSelary,AskForLeave
}
public void handleRequest(RequestType request) {
switch (request) {
//这里不能写成RequestType.AddSelary,否则会编译报错
case AddSelary:
break;
case AskForLeave:
break;
}
}
更常见的是,我们应该通过RequestType.AddSelary来引用,这是enum与switch在一起使用时存在的一个问题,原因不详。
有个DJ Java Decompiler 3.7软件,可以把java编译生成的.class文件反编,生成.java文件。
将public enum RequestType编译生成.class文件之后,再用软件将其反编,可以看到public final class RequestType extends Enum
需要注意:
1.enum最终会成为一个class
2.它继承自Enum
更深的东西我就不懂啦。
Oracle官网上似乎对这个问题有个专门的解释,一大堆英文,总的意思我是这么理解的:
以前面的代码为例,在switch中,我们能够明确AddSelary一定指的是RequestType.AddSelary,既然如此,我们完全没有必要那么麻烦地写成RequestType.AddSelary。而不在swtich中的时候,如果我们不写成RequestType.AddSelary,那么它很有可能指向XXXX.AddSelary,所以我们又必须加上RequestType。
另:switch只能对char,byte,short,和int类型进行判断,而对long类型是不可以的,原因是在编译的过程中,都会转化为int类型,而long类型不能转换成int,所以不行。
当然,enum它是个类,但其实它在编译的过程中也被转成了int类型。
jdk自带一个javap工具,可以反编class文件,但转成的字节码我不会看。不知谁有学习的方法,还望不吝赐教!