java JDK8 学习笔记——第18章 自定义泛型、枚举与注释

第十八章 自定义泛型、枚举与注释

18.1 自定义泛型

泛型定义:

(1)仅定义在方法上的泛型语法 
(2)用来限制泛型可用类型的extends与super关键字
(3)?类型通配字符的使用

18.1.1 使用extends与?

1、若extends之后指定了类与接口,想再指定其他接口,可以使用&连接。

2、如果B是A的子类,而Node< B>可视为一种Node< A>,则称Node具有共变性或有弹性的。Java泛型不具有共变性,可以使用类型通配字符?与extends来声明变量,使其达到类似的共变性。

3、若声明?不搭配extends,则默认为? extends Object。

Node<?> node = null;//相当于Node<? extends Object>

4、java的泛型语法在执行时期实际上只会知道是Object类型,由于无法在执行时期获得类型信息,编译程序只能就编译时期看到的类型来做检查,因而造成以上谈及的限制。

18.1.2 使用super与?

1、如果B是A的子类,而Node< A>可视为一种Node< B>,则称为Node具有逆变性。Java泛型不具有逆变性,可以使用类型通配字符?与super来声明,使其达到类似的逆变性的效果。

2、若泛型类或接口不具共变性或逆变性,则称为不可变的或严谨的。

18.2 自定义枚举

18.2.1 了解java.lang.Enum类

1、直接撰写程序继承Enum类会被编译程序拒绝。

2、Enum是个抽象类,无法直接实例化,它操作了Comparable接口。Action的构造函数被声明为private,因此只能在Action类中调用。

3、在JDK1.4之前撰写的API,仍是使用interface定义常数作为枚举值。

4、Enum的equals()方法与hashCode()方法基本上继承了Object的行为,但被标示为final。由于标示为final,所以定义枚举是,不能重新操作equals()与hashCode(),这是因为枚举成员,在JVM中智慧存在单一实例,Object定义的equals()与hashCode()作为对象相等性比较是适当的定义。

18.2.2 enum高级运用

1、values()方法,将内部维护Action枚举实例的数据复制后返回。如果想要知道有哪些枚举成员,就可以使用这个方法。

2、Enum类可以自行定义构造函数,但不得为公开构造函数,也不可以在构造函数中调用super()。

3、在enum中调用构造函数比较特别,直接在枚举成员后加上括号,就可以指定构造函数需要的自变量。

4、在static区块中,编译程序仍自行维护name与ordinal的值,接着才是调用自定义构造函数时传入的value值。

5、特定值类本体语法:在枚举成员后,直接加上{}操作Command的execute()方法,这代表着每个枚举实例都会有不同的execute()曹组欧,在职责分配上,比switch的方式清楚许多。特定值类本体语法不仅在操作接口时可以使用,,也可以运用在重新定义父类方法。

18.3 关于注释

在原始码中使用注释,对编译程序提供额外编译提示,或提供应用程序执行时期可读取的组态信息。注释可以仅用于原始码,编译后留在.class文档仅供编译程序读取或开放执行时期读取。

18.3.1 常用标准注释

1、@Override 
就是标准注释,被注释的方法必须是父类或接口中已定义的方法,请编译程序协助是否真的为重新定义方法。

2、@Deprecated 
如果某个方法原先存在与API中,后来不建议再使用,可以在该方法上注释。若有用户后续想调用或重新定义这个方法,编译程序会提出警告。对于支持泛型的API,建议明确指定泛型真正类型,如果没有指定,编译程序会提出警告。

3、@SuppressWarnings 
指定抑制unchecked的警告产生:

@SuppressWarnings(value={"unchecked"})

4、@SafeVarargs 
表明开发人员确定避免了heap pollution问题。heap pollution问题就是编译程序无法检查执行时期的类型错误,无法具体确认自变量类型。

5、@FunctionalInterface 
让编译程序可协助检查interface是否可做为lambda的目标类型

18.3.2 自定义注释类型

1、标示注释:就是注释名称本身就是信息,对编译程序或应用程序来说,主要是检查是否有注释出现,并作出对应的动作。

2、相关规则:

(1)如果注释名称本身无法提供足够信息,设置单值注释 
(2)注释属性也可以用数组形式指定。 
(3)在定义注释属性时,如果属性名称为value,则可以省略属性名称,直接指定值。 
(4)对成员设定默认值,使用default关键字即可。 
(5)要设定数组默认值,可以在default之后加上{},必要时{}中可放置元素值。

3、定义注释时,可使用java.lang.annotation.Target限定时可指定java.lang.annotation.ElementType的枚举值。

4、在制作JavaDoc文件时,默认不会将注释数据加入文件中,如果想要将注释数据加入文件,可以使用java.lang.annotation.Documented。

5、默认父类设定的注释,不会被继承至子类,在定义注释时,设定java.lang.annotation.Inherited注释,就可以让注释被子类继承。

18.3.3 JDK8标注增强功能

1、ElementType的枚举成员是用来限定哪个声明位置可以进行标注。在JDK8中,增加了两个枚举成员TYPE _PARAMETER、TYPE _USE。

2、ElementType.TYPE _ USE可用于标注在各式类型,一个标注如果被设定为ElementType.TYPE_USE,只要是类型名称,都可以进行标注。

3、@Repeatable 
可以让你在同一个位置重复相同标注

4、@Filters 
作为收集重复标注信息的容器,而每个@Filters储存各自指定的字符串值。

18.3.4 执行时期读取注释信息

1、自定义注释,默认会将注释信息存储于.class文档,可被编译程序或位码分析工具读取,但执行时期无法读取注释信息,在执行时期读取注释信息,可以使用java.lang.annotation.Retention搭配java.lang.annotation.RetentionPolicy枚举指定。

2、RetentionPolicy为RUNTIME的时机,在于让注释在执行时期提供应用程序信息,可使用java.lang.reflect.AnnotatedElement接口操作对象取得注释信息。

3、JDK 8中新增了getDeclaredAnnotation()、getDeclaredAnnotationsByType()、getAnnotationsByType()三个方法。 
getDeclaredAnnotation()可以让你取回指定的标注,在指定@Repeatable的标注时,会寻找收集重复标注的容器。 
getDeclaredAnnotationsByType()、getAnnotationsByType()就不会处理@Repeatable的标记。

时间: 2024-10-26 10:11:32

java JDK8 学习笔记——第18章 自定义泛型、枚举与注释的相关文章

java JDK8 学习笔记——第16章 整合数据库

第十六章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API中的接口会有数据库厂商操作,称为JDBC驱动程序. 2.JDBC标准主要分为两个部分:JDBC应用程序开发者接口和JDBC驱动程序开发者接口.应用程序需要联机数据库,其相关API主要在java.sql和javax.sql两个包中. 3.应用程序使用JDBC联机数据库的通用语法: Connection conn = DriverManager.g

java JDK8 学习笔记——第13章 时间与日期

第十三章 时间与日期 13.1 认识时间与日期 13.1.1 时间的度量 1.格林威治标准时间GMT 格林威治标准时间的正午是太阳抵达天空最高点之时.现在已经不作为标准时间使用. 2.世界时UT世界时是借由观测远方星体跨过子午线而得,在引入UTC之前,GMT和UT是相同的. 3.国际原子时TAI 将秒的国际单位定义为铯原子辐射振动91926331770周耗费的时间,从UT的1958年开始同步. 4.世界协调时UTC 采用了闰秒修正,确保UTC与UT相差不会超过0.9秒,加入闰秒的时间通常会在6月

java JDK8 学习笔记——第15章 通用API

第十五章 通用API 15.1 日志 15.1.1 日志API简介 1.java.util.logging包提供了日志功能相关类与接口,不必额外配置日志组件,就可在标准Java平台使用是其好处.使用日志的起点是Logger类,Logger类的构造函数标示为protected,不是java.util.logging同包的类不能直接以new创建,要取得Logger实例,必修使用Logger的静态方法getLogger(). 2.调用getLogger()时,必须指定Logger实例所属名称空间,名称

java JDK8 学习笔记——第17章 反射与类加载器

第十七章 反射与类加载器 17.1 运用反射 反射:.class文档反映了类基本信息,从Class等API取得类信息的方式称为反射. 17.1.1 Class与.class文档 1.java.lang.Class的实例代表Java应用程序运行时加载的.class文档,类.接口.Enum等编译过后,都会生成.class文档.Class类没有公开构造函数,实例时候JVM自动产生,每个.class文档加载时,JVM会自动生成对应的Class对象. 2.取得Class对象的方式: (1)通过Object

java JDK8 学习笔记——助教学习博客汇总

java JDK8 学习笔记——助教学习博客汇总 1-6章 (by肖昱) Java学习笔记第一章——Java平台概论 Java学习笔记第二章——从JDK到IDEJava学习笔记第三章——基础语法Java学习笔记第四章——认识对象 Java学习笔记第五章——对象封装 Java学习笔记第六章——继承与多态 7-10.12.14章 (by吴子怡) Java学习笔记JDK8>学习总结 11.13.15-18章 (by宋宸宁) 第11章 第13章第15章第16章第17章第18章

Java Web 学习笔记 第三章 java基础(二)

第三章 java基础(二) 一.转义符 转义字符是"\",通过转义字符,可表示一些特殊的字符. 例如: '\n'  表示回车 '\t'   表示 制表符字符,一个制表符表示向右跳8-10个字符 '\\'   表示\ '\''   表示单引号 '\"'  表示双引号 "\u4e2d"表示unicode编码对应的字符(汉字:中). 二.布尔类型的概念和用法 boolean 类型用来表示肯定或否定两种可能. boolean 常用在分支语句.循环语句中. true

java设计模式学习笔记第三章

适配器(Adapter)模式 接口适配 适配器模式的意图在于,使用不同接口的类所提供的服务为客户端提供它所期望的接口. <interface>                                                     PhysicalRocket RocketSim                                                      PhysicalRocket( getMass():double              

Java私人学习笔记——第4章 类和对象基础

4.1 面向对象基础 4.1.2 面向对象的基本特征 1.封装性     2.继承性     3.多态性 4.2 Java类和对象 4.2.1 类的定义 类的定义包括类声明和类体的定义: 1.类声明 [public][abstract | final]class ClassName[extends SuperClass][implements InterfaceNameList]{ //成员变量声明 //成员方法声明 } 抽象类不能实例化,final最终类不能被继承: 4.2.2 对象的使用 引

Java私人学习笔记——第2章 数据类型和运算符

2.2 数据类型 2.2.1 Java数据类型 2.3 常用运算符 Java提供了一组运算符丰富的操纵变量.我们可以把所有的Java操作符为以下几组: 算术运算符 关系运算符 位运算符 逻辑运算符 赋值运算符 其它运算符 算术运算符: 算术运算符用于在数学表达式中,他们是在代数中使用的方法相同.下表列出了算术运算符: 假设整型变量A=10和变量B=20,则: 算术运算实例 运算符 描述 实例 + Addition - Adds values on either side of the opera