一、什么是泛型
Java 泛型( generics) 是 JDK 5 中引⼊的⼀个新特性, 允许在定义类和接⼜的
时候使⽤类型参数,泛型最⼤的好处是可以提⾼代码的复⽤性。
二、java处理泛型的发方式
虚拟机中没有泛型,只有普通类和普通方法,所有泛型类的类型参数在编译时都会被 擦除,泛型类并没有自己独有的 Class 类对象。比如并不存在 List<String>.class 或是List<Integer>.class,而只有 List.class
Code sharing :对每个泛型类只生成唯一的一份目标代码;该泛型类的所有实例 都映射到这份目标代码上,在需要的时候执行类型检查和类型转换 。
Java 编译器通过 Code sharing 方式为每个泛型类型创建唯一的字节码表示,并且将 该泛型类型的实例都映射到这个唯一的字节码表示上。将多种泛型类形实例映射到唯一的字 节码表示是通过类型擦除(type erasue)实现的 。 Java 语言中的泛型只在程序源码中存在,在编译后的字节 码文件中,就已经被替换为原来的原生类型(Raw Type,也称为裸类型)了,并且在相 应的地方插入了强制转型代码,因此对于运行期的 Java 语言来说,ArrayList与ArrayList就是同一个类。所以说泛型技术实际上是 Java 语言的一颗语法糖,Java 语言中的泛型实现方法称为类型擦除,基于这种方法实现的泛型被称为伪泛型。
三、泛型使用范围
可以用在类、接口、方法上
类:public class Message<T>
接口:public interface Message<T>
方法:
四、泛型带来的问题
1.重载问题:观察下面代码
上面这段代码,有两个重载的函数,因为他们的参数类型不同,一个是 List另一个是 List ,但是,这段代码是编译通不过的。因为我们前面讲过,参数List和 List编译之后都被擦除了,变成了一样的原生类型 List,擦除动作导致这两个方法的特征签名变得一模一样。
2.当泛型内包含静态变量
答案是——2!由于经过类型擦除,所有的泛型类实例都关联到同一份字节码上,泛型类的所有静态变量是共享的
五、泛型通配符
泛型中 K T V E ? object 等的含义 E - Element (在集合中使用,因为集合中存放的是元素) T - Type(Java 类) K - Key(键) V - Value(值) N - Number(数值类型) ? - 表示不确定的 java 类型(无限制通配符类型) S、U、V - 2nd、3rd、4th types
示例:fun()中使用?就可以接受不确定java类型,其中信息也不会被修改
上下界限定符<? extends T>和<? super T>
<? extends Number>:是指 “上界通配符(Upper Bounds Wildcards)”,即泛型中 的类必须为当前类的子类或当前类
示例:
<? super String>:是指 “下界通配符(Lower Bounds Wildcards)”,即泛型中的 类必须为当前类或者其父类
示例: