什么是'泛型'
泛型(Generics)不管在面试还是实际开发过程中都有高频率的应用,本文将带读者复习或更深层次的了解泛型的概念以及其底层原理
01 | '泛型'的概念
泛型,官方解释叫做“参数化类型”。
通俗的意思就是:将类、方法、变量的类型以参数的形式定义,然后在使用到对应类、方法、变量的时候再传入具体的类型。
概念比较抽象且不好理解,下面我们通过具体实例应用来体会一下:
02 | 泛型应用:集合
众所周知的定义集合的语法:List<> stringList = new ArrayList<>();
List后为何要用"<>"符号,为什么要这样写?
其实这个“<>”就是指泛型。我将List接口源码拷过来给大家看一下泛型是如何定义的:
03 | 关于'通配符':E、T、E、K、U、?
通配符常用的有以上几种,严格来说这些字母并无区别,只不过是java为我们制定的一种编码规范,就像是命名要驼峰一样。
其实通配符写什么都可以,只是编码规范为上面这几个字母赋予了不同的意义:
?:不确定的java类型
T : 表示一个java类型
K : java键值中的key
V : java键值中的value
E :集合中专用
04 | 由'通配符'延申的‘边界’的概念
通配符的另外一种写法叫做’边界通配符’:
1、<T extends H> : 上界通配符(extends),意思是该泛型可以容纳的类型参数只有H类以及H类下派生的子类
2、<T super H> : 下界通配符(super),意思是该泛型可以容纳的类型参数只有H类以及以H基类的父类
05 | 泛型的原理:擦除
通过上面的例子读者了解了泛型的概念以及泛型的通配符和边界,接下来给读者拆解一下泛型的底层原理。
java中的泛型只作用于编译期,原因是编译器将泛型类的.java文件编译成.class文件的时候,会对泛型进行擦除操作:
对比一下可以看出:编译器将类型参数T替换为了固定类型Object类(Object类是所有类的默认父类,所以可以承接任何类型的对象)
结合一下上文提到的‘边界’的概念,将通配符T修改为T extends H,编译之后将被替换成H。这就是泛型的底层逻辑。
小试牛刀