前言
泛型程序设计(generic programming)是程序设计语言的一种风格或范式。泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样
一、泛型
1. 什么是泛型
在java 中,泛型就是把类型明确的工作推迟到创建对象或调用方法的时候才去确定的特殊的类型,泛型可以把类型当作参数一样传递,泛型的数据类型只能是引用类型,Java泛型设计原则:只要在编译时期没有出现警告,那么运行时期就不会出现ClassCastException异常,
2. 泛型存在的意义
在Java 1.5 之前是使用Object来代表任意类型的,但是向下转型有强转的问题,这样程序就不太安全,泛型就是来解决这个问题的
2. 泛型的使用
-
在java中, T、E、K、V等形式的参数常用于表示泛型
-
泛型类
- 泛型类就是把泛型定义在类上,用户使用该类的时候,才把类型明确下来
- 泛型类就是把泛型定义在类上,用户使用该类的时候,才把类型明确下来
-
泛型接口
-
泛型方法
- 泛型定义在方法上,先确定后使用,在返回值端加上< E> 是为了声明返回值类型是泛型
- 泛型定义在方法上,先确定后使用,在返回值端加上< E> 是为了声明返回值类型是泛型
-
泛型的擦除
- 泛型类型信息只在编译的时候发挥作用,一旦被加载到虚拟机泛型信息会被全部丢弃。所以在编译阶段List和List可以看做两个不同的类型,但是一旦加载到虚拟机,他们就是同样的类型。泛型被丢了,那他是个什么类型?用专业的话说就是擦除到泛型的上限。比如没有指定上限的时候,擦除后的类型是Object,如果制定了类型的上限比如<? extends Book>,那么擦除后的类型就是Book
二、通配符
1.为什么要使用通配符
- 泛型中的< Object>并不是像以前那样有继承关系的,也就是说List< Object>和List< String>是毫无关系的!!!!于是Java泛型提供了类型通配符 ?,使用通配符就相当于在使用Object,可以扩大参数的接收范围
- 当集合使用?号通配符的时候:集合就只能调与类型无关的方法,不能调用与类型有关的方法。因为不确定集合中的类型到底是什么,所以只能调用size 之类的与集合类型无关的方法
2.上限通配符
- 上限通配符的表现形式:<? extends E>
- 使用上限通配符无法进行add 操作,因为你无法确定它的下限到底在哪
- 使用上限通配符,我们可以确定集合的具体上限,也就是 E (object除外),因为在上限通配符的集合中所有元素都继承自 E,所以在进行遍历的时候可以都强转为 E 类型进行便利
3. 下限通配符
- 下限通配符的表现形式:<? super E>
- 下限通配符可以进行add操作,但是也只仅局限于add E类型的数据,因为在下限通配符中E 肯定其它类型的子类
- 使用下限通配符,因为不明确集合的最高父类到底是什么,所以遍历时只能当做 Object 进行遍历
三、泛型和通配符如何选择
- 如果参数之间的类型有依赖关系,或者返回值是与参数之间有依赖关系的。那么就使用泛型方法
- 如果没有依赖关系的,就使用通配符,通配符会灵活一些
总结
加油噢!