系列文章目录
讲解泛型类,泛型接口,泛型方法,类型擦除以及一些注解
目录
一、泛型
1.作用
泛型能够使我们编写出来通用的代码,提高代码的可读性和重用性。通过使用泛型,我们可以在类和接口和方法中使用类型参数,使得代码可以处理不同类型的数据,同时保持类型安全
2.泛型类
如果泛型参数定义在类上,那这个类就是个泛型类
【修饰符】class 类名<泛型类型名1,泛型类型名2.........>{}
实例化时:
泛型类名<具体类型1,具体类型2....> 对象名 = new 泛型类名<>(实参列表);
可以限定类的实例化参数类型
3.泛型接口
如果泛型参数定义在接口上,那这个类就是个泛型接口
4.泛型方法
如果泛型参数定义在方法上,那这个类就是个泛型方法
【修饰符】<泛型类型名> 返回值类型 方法名(形参列表){}
泛型方法调用:(不需要额外指定泛型类型,系统会自动识别)
类对象.泛型方法(实参);
类名.static泛型方法(实参);
==两边所指定的泛型类型必须相等
5.通配符
? :可以通配任意类型
注意:
1.使用通配符(?)的集合,不能再往里添加元素,但是可以遍历集合
2.如果添加元素,编译器不知道将来是什么类型,所以会报错。
6.泛型边界
extends super
1.上限
类型名<? extends 类型> 对象名称
只能接收该类型以及该类型的子类型,所以是定义了上限
2.下限
类型名<? super 类型> 对象名称
只能接收该类型和该类型所继承的父类型,所以是定义了下限
7.类型擦除
泛型类型仅存在于编译期间,编译后的字节码和运行时不包含泛型类型,所有的泛型类型映射到同一份字节码文件
作用:
Java泛型只存在于编译时期,泛型使编译器可以在编译期间对类型进行检查以提高类型安全,减少运行时由于对象类型不匹配引发的异常,但是编译成功后,所有泛型信息会被擦除,变为Object
注意:
泛型信息被擦除后,所有的泛型类型都会统一变为Object
二、注解
1.作用
1.编译检查:编译器通过代码里标记的注解实现基本的编译检查
2.编写文档:javadoc工具根据代码中注解生成API文档
3.代码分析:通过代码里的注解对代码进行分析(借助反射实现)
2.注解和注释的区别
注解是给其他程序看的,通过参数的设置,可以在编译后class文件中【保留】注解的信息,其他程序读取后,可以完成特定的操作
注释是给程序员看的,无论怎么设置,编译后class文件中都【没有】注释信息,方便程序员快速了解代码的作用和结构
3.定义
注解本质上是一个接口,默认继承Annotation接口
注解属性本质上是接口中的抽象方法
4.注解属性赋值
@注解名(属性1 = 属性值,属性2 = 属性值,......)
如果注解属性存在default默认值,则使用该注解时,可以不给该属性赋值
如果属性名称为value,则只需要给其赋值,则value可以省略,直接赋值
数组属性赋值时,一般{}包裹,如果只有一个值可以省略{};
5.元注解
我们在自定义注解的时候,一般会使用元注解,来设置自定义注解的基本特点。
元注解就是对注解进行基本信息设置的注解
常用元注解:
@Target:描述注解的使用范围,例如用在类上面还是方法上面
@Retention:描述注解的保存策略,是保留在源代码中,class文件,还是加载到内存里
@Documented:描述该注解是否会被javadoc抽取到API文档里
@Inherited,描述该注解是否会被继承,如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类
6.注解范围
注解范围定义在枚举类ElementType中
常用的注解:
TYPE:使用在类,接口,注解,枚举等类型上面
FIELD:使用在属性上面
METHOD:使用在方法上面
PARAMETER:使用在方法的参数前面
CONSTRUCTOR:使用在构造器上
LOCAL_VARIABLE:使用在局部变量上
ANNOTATION_TYPE :使用在注解类型上
TYPE_PARAMETER:使用在声明泛型参数前面,JDK8新增
PACKAGE:使用在包上
TYPE_USE:使用在大妈中任何类型前,JDK8新增
7.保持
三种保留策略,定义在枚举类RetentionPolicy中
类中使用的注解,根据配置,可以保持到三个不同的阶段:
SOURCE:注解只保留在源文件,当java文件编译class文件时,注解被遗弃
CLASS:注解被保留在class文件,但JVM加载class文件时被遗弃
RUNTIME:注解不仅仅保存到class文件中,JVM加载class问价后,仍然存在