java.lang.Enum定义理解

java.lang.Enum的定义是:

public abstract class Enum<E extends Enum<E>>
extends Object
implements Comparable<E>, Serializable

其它先不说,主要谈谈对“Enum<E extends Enum<E>>”的理解。

首先,这是一个泛型,使用E作为类型参数。

其次,对于E有上界限制,即E必须是Enum<E>的子类。注意,这里使用了Enum<>泛型,而且是在Enum<>的定义还未完成之前使用它。这是否合法?嗯,只要编译器允许就是合法的。但是这何以可能,或者说怎么样理解才不会出现逻辑上的困惑?

对于Java的泛型(generics)有一种“擦拭(erasure)”的机制来描述它的实现。基于这种机制,我谈一下对Enum的理解。根据“擦拭”机制,泛型的所有参数类都可以替换为Object类型,因为都是引用,所以对于编译器来说,上面这个定义可以拆分成两个步骤:

  第一步:用Object替代类型参数“E extends Enum<E>”,完成Enum的定义。

 第二步:处理对于类型参数E的约束。“E extends Enum<E>”在擦拭后,翻译过来实际上就是要求E是类型Enum的一个子类,因此编译器可以在Enum中插入代码,对于Object引用的实例对象进行动态类型检查,看E是不是Enum的子类。显然,这是容易做到的,而且在Enum定义中的方法代码中检查一个对象是不是自己的子类(只需访问该对象的元信息),也完全在逻辑上是自然、合理的。

这么一弄,语法上的递归定义就是没有了,也就很好理解了。至于为什么要弄成这个形式,据说是为了类型安全。


进一步参考:

Section 3.5, Enumerated Types,in Java Generics and Collections. Maurice Naftalin & Philip Wadler,O'Reilly

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值