博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java泛型 - 如何破解"Enum<E extends Enum<E>>"?
阅读量:6407 次
发布时间:2019-06-23

本文共 2441 字,大约阅读时间需要 8 分钟。

以下内容翻译自链接内容其中一段章节:

  • How do I decrypt "Enum<E extends Enum<E>>"?
Enum<E>仅允许它的子类
Color extends Enum<Color>去具现化它,并且
Color继承了
Enum<Color>中一些有用的方法,而这些方法是接收或返回
Color类型的参数的。

public abstract class Enum
> { ...}

Enum类是Java内所有枚举类型的通用基础类。例如enum Color {}会被编译成class Color extends Enum<Color>Enum<E>泛型基类存在的目的是为所有枚举类型提供基础的方法及功能

以下是Euum类的骨架:

public abstract class Enum< E extends Enum
> implements Comparable
, Serializable { private final String name; public final String name() { ... } private final int ordinal; public final int ordinal() { ... } protected Enum(String name, int ordinal) { ... } public String toString() { ... } public final boolean equals(Object other) { ... } public final int hashCode() { ... } protected final Object clone() throws CloneNotSupportedException { ... } public final int compareTo( E o) { ... } public final Class
getDeclaringClass() { ... } public static
> T valueOf(Class
enumType, String name) { ... } }

以下是实际使用中的enum Color:

enum Color {RED, BLUE, GREEN}

Java编译器会将它编译成:

public final class Color extends Enum
{ public static final Color[] values() { return (Color[])$VALUES.clone(); } public static Color valueOf(String name) { ... } private Color(String s, int i) { super(s, i); } public static final Color RED; public static final Color BLUE; public static final Color GREEN; private static final Color $VALUES[]; static { RED = new Color("RED", 0); BLUE = new Color("BLUE", 1); GREEN = new Color("GREEN", 2); $VALUES = (new Color[] { RED, BLUE, GREEN }); } }

Color继承了所有Enum<Color>所实现了的方法。compareTo方法就是其中之一。

可以看到,Color.compareTo接收的参数应该也必须是Color类型实例。为了让这能够实现,Enum设置了泛型<E>并在Enum.compareTo实现中以E类型的实例作为方法参数。

clipboard.png

作为继承的结果,Color类型从Enum<Color>中派生出来的compareTo方法实际上接收的参数就是Color类型的实例,这完美地达成了设计目标。

如果我们继续深入解剖类声明Enum<E extends Enum<E>>,我们可以看到它有以下几方面的意义:

第一,Enum的泛型E的上界为Enum自身。这确保了只有Enum的子类才被允许成为泛型参数。(理论上,Enum可以被它自己具现化,例如Enum<Enum>,但这没有意义,并且很难想象这会有对应的应用场景。)

第二,泛型E的上界被进一步限定为extends Enum<E>,这确保了Enum<子类A>Enum<子类A>的子类A的继承关系一定满足子类A extends Enum<子类A>。类似子类A extends Enum<子类B>这样的声明会被编译器拒绝,因为这个声明并不匹配泛型参数的上界。

第三,基于Enum被设计为泛型,这意味着Enum中的某些方法的方法参数返回类型未知类型(又或者说是依赖于某未知类型)。而根据E extends Enum<E>,我们可以知道E肯定会是Enum的子类。所以,在具象化类型Enum<某具体类>中,这些泛型方法的参数返回类型就会被编译器转换为某具体类型。(compareTo就是一个例子)。总结来说,E extends Enum<E>保证了每个Enum<E>的子类中都能够接收并返回该子类类型E

转载地址:http://xkhea.baihongyu.com/

你可能感兴趣的文章
http协议与http代理
查看>>
【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例...
查看>>
Redis+Spring缓存实例
查看>>
Storm集群安装详解
查看>>
centos7.x搭建svn server
查看>>
原码编译安装openssh6.7p1
查看>>
项目实战:自定义监控项--监控CPU信息
查看>>
easyui-datetimebox设置默认时分秒00:00:00
查看>>
蚂蚁分类信息系统5.8多城市UTF8开源优化版
查看>>
在django1.2+python2.7环境中使用send_mail发送邮件
查看>>
“Metro”,移动设备视觉语言的新新人类
查看>>
PHP源代码下载(本代码供初学者使用)
查看>>
Disruptor-NET和内存栅栏
查看>>
Windows平台ipod touch/iphone等共享笔记本无线上网设置大全
查看>>
播放加密DVD
查看>>
分享Silverlight新鲜事 - Silverlight Firestarter全球会议
查看>>
产品设计体会(3013)项目的“敏捷沟通”实践
查看>>
RHEL6.3基本网络配置(1)ifconfig命令
查看>>
网络诊断工具之—路由追踪tracert命令
查看>>
Java模拟HTTP的Get和Post请求(增强)
查看>>