泛型
需求:
定义一个集合存储一批字符串,然后把字符串的元素转换成大写
- 好处:
- 可以把运行时出现的问题,提前至编译时。
- 避免了无畏的强制类型转换
- 注意事项
- 泛型中没有多态的概念
- 左右两边的数据类型必须要一致
- 或者只写一边的泛型
- 推荐使用
两边都写上同样数据类型的泛型
自定义的泛型:
可以理解为是一个数据类型的变量,或者是一个数据类型的占位符
- 格式:
修饰符 <声明自定义泛型> 返回值类型 函数名(形参列表)
- 注意细节:
- 函数上自定义泛型的具体数据类型是在调用该函数的时候,传递实参数据的时候确定具体的数据类型的
- 泛型中是不能使用基本数据类型数据的,如果需要使用基本数据类型数据,那么就要使用基本数据类型对应的包装类型
float-----> Float double----> Double char------> Character boolean---> Boolean byte------> Byte short-----> Short long------> Long```
- 自定义泛型使用的标识符可以自定义的,只要符合标识符的命名规则即可。但是一般自定义泛型使用的标识符都是单个大写字母(T E)
自定义泛型类:
- 格式:
class 类名<T>{}
- 泛型类要注意的事项:
- 类上声明的自定义泛型的具体数据类型是在使用该类创建对象的时候确定下来的
- 如果一个类已经声明了自定义泛型,该类在创建对象的时候没有指定自定义泛型的具体数据类型,那么则默认为Object数据类型
- 静态大方法不能使用类上声明的自定义泛型,如果需要使用自定义泛型就必须在自己的方法 上声明
泛型接口:
- 定义格式:
interface 接口名 <声明自定义的泛型>{}
- 注意的细节:
1. 接口上自定义泛型的具体数据类型是实现该接口的时候确定的
2. 如果一个接口已经自定义了泛型,那么在实现类的时候,没有指定自定义泛型的具体数据类型,那么默认为Object数据类型
泛型的上下限:
- 需求1:
定义一个方法,可以接受任意类型的集合对象,接受的集合对象只能存储Integer以及Integer父类类型的数据
- 需求2:
定义一个方法,可以接受任意类型的集合对象,接受的集合对象只能存储Number以及Number子类类型的数据
- 泛型的通配符:?
需求1:
? super Integer (泛型的下限) 只能用于Integer或者是Integer的父类
需求2:
? extends Number (泛型的上限) 只能用于Number或者是Number的子类