Java泛型的定义、意义、使用、工作方式以及限定通配符

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 非限定通配符

非限定通配符即<?>,可以是任何类型,但是它不可以定义类和泛型方法,一般用作参数,如下图。

猜你喜欢

转载自blog.csdn.net/yldmkx/article/details/109402277