Java中的enum在switch中的一个疑问

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文件,但转成的字节码我不会看。不知谁有学习的方法,还望不吝赐教!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值