1. 泛型的定义和意义
什么叫泛型?泛型,顾名思义就是广泛的类型,专业术语为“参数化类型”;当我们创建对象时不指定类型,任何引用类型都可以放入该对象,如果是基本类型,需要使用对应的包装类,兼容多种数据类型,如下图。
但是指定类型后,只能将特定类型放入该对象,如下图,指定String类型后,整型数据就不能使用,此时是类型安全的,同时可使用增强for进行遍历。
2. 泛型的使用和工作原理
2.1 泛型类的自定义及使用
泛型类的定义如下图,创建对象时不指定类型,可以传入不同的类型参数,但是指定类型后,只能传入String类型参数。
2.2 工作原理
事实上,泛型只在编译阶段有作用,编译器检验泛型信息之后,如果没有限定类型,那么会替换为Object类型,同时在泛型方法的参数列表进行类型检查,在返回值时进行类型转换。也就是说,编译阶段检验泛型后会进行泛型擦除,在编译后的 .class字节码中是不存在泛型信息的。如下图,我们可以将字节码文件反编译看看源代码。
扫描二维码关注公众号,回复:
12647020 查看本文章

那么类型擦除的作用是什么呢? 是为了确保和没有泛型特性的JDK5版本的类库兼容。
3. 限定通配符和非限定通配符
3.1 限定通配符
限定通配符有两种:一种是<? extends T>,通过这种来确保类型必须是T的子类,可以是T本身,也可以是子类的子类,来设定类型的上界;另一种是<? super T>,通过确保类型必须是T的父类来设定类型的下界。当使用限定通配符之后,反编译的泛型类型是什么呢?代码及反编译结果如下图
<? super T>类似,可以自行测试。
3.2 非限定通配符
非限定通配符即<?>,可以是任何类型,但是它不可以定义类和泛型方法,一般用作参数,如下图。