泛型的引入背景:
为了能够写一个类/方法就能同时支持多种不同类型的对象
所谓的泛型,其实就是从语法层面上对 Object 进行了一个简单的包装,编译过程帮我们自动加上一些编译器的类型检查,自动帮我们完成一些类型转换工作
举个例子:
定义一个泛型类
package com.Test0825;
/**
* Create with IntelliJ IDEA
* Description:
* User:Zyt
* Date:2020-08-25
*/
public class SeqList<E> {
//当前这个 data 的类型是啥,可以当成一个 Object[],具体代表的是那种类型
private E[] data = (E[]) new Object[100];
private int size;
public E get(int index){
return data[index];
}
public void add(E elem){
data[size] = elem;
size++;
}
public static void main(String[] args) {
SeqList<String> seqList = new SeqList<>();
//String 也是继承自 Object
//调用 add 的时候相当于向上转型
seqList.add("aaa");
seqList.add("bbb");
String str = seqList.get(0);
}
}
E:是泛型参数(相当于一个形参,需要在真正对该类进行实例化的时候,确定实参),泛型参数常见的名字:E,T,KEY,VALUE……
泛型参数类似于一个“模板”,泛型这样的语法是一种编译期的机制,为了方便程序员书写代码,以及在编译过程进行一些类型检查操作,编译完成了之后在运行过程中,是没有泛型的,编译代码过程中,直接把泛型参数就当成了 Object,只不过编译期自动加上了一下类型转换操作以及类型校验操作
如果是 int double 这些基础类型如何套用到泛型中?
用基础库中的包装类
基本数据类型 | 包装类 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
包装类首字母都要大写,只有char 和 int 类型区别比较大需要注意
举个例子
这个操作相当于把 int 转换成 Integer 就是装箱(boxing)
或者用下面的三种方式
而将 Integer 转换回 int 就叫做拆箱(unboxing)