参考
https://segmentfault.com/a/1190000012136751
https://segmentfault.com/a/1190000014824002?utm_source=tag-newest
https://blog.csdn.net/hello_worldee/article/details/77934244
占位符
通用占位符,也叫通配符,占位符中包含“?”问号,表示接任意数据类型或者指定范围数据类型。
普通占位符,E, T, K, V一般是单字母大写,表示接收特定的类型。
- T Type
- K V Key Value
- E Element
泛型声明方式
<占位符>
泛型的优点
数据类型安全
泛型的主要目的通过参数类型检查,提高JAVA程序数据类型的安全,提早发现错误,避免ClassCastException 异常发生。
消除类型转换
当我们不使用泛型时,每次取出集合中的元素都需要我们强制转换成我们需要的元素(Object->Class Type)。
简码,提高效率
通过泛型的应用,做到了简码,而且JVM中类文件也相应的减少。JVM几乎没有做任何的更改,所有的类型校验,类型转换都是在编译器阶段完成。
泛型类
泛型类和普通类的区别就是类定义时,在类名后加上泛型声明。
泛型类的内部成员、方法就可以使用声明的参数类型。
泛型类最常见的用途就是作为容纳不同数据类型的容器类,比如Java集合容器类。
泛型接口
和泛型类一样,泛型接口在接口名后添加泛型声明,接口方法就可以直接使用声明的参数类型。
实现类在实现泛型接口时需要指明具体的参数类型,不然默认类型是 Object,这就失去了泛型接口的意义。
泛型方法
泛型方法指的是使用泛型的方法。如果这个方法所在的类是个泛型类,直接使用类声明的参数类型。
如果这个方法所在的类不是泛型类或者他想要处理不同于泛型类所声明的参数类型,这时候我们就需要使用泛型方法。
即在方法前加入泛型声明,方法就可以直接使用声明的参数类型。
通配符
上界通配符 <? extends E>
在类型参数中使用extends表示这个泛型中的参数必须是 E 或者 E 的子类,这样有两个好处:
- 如果传入的类型不是E或者E的子类,编辑不成功
- 泛型中可以使用E的方法,要不然还得强转成E才能使用
当使用上边界通配符时,是不允许往里存数据的,不确定具体元素类型。
下界通配符 < ? super E>
在类型参数中使用super表示这个泛型中的参数必须是E或者E的父类。
用于灵活写入或比较,使得对象可以写入父类型的容器,使得父类型的比较方法可以应用于子类对象。