基本概念
泛型本质是**“数据类型的参数化”。我们可以把泛型理解为数据类型的一个占位符,即告诉编译器,在调用泛型时必须传入实际类型。这种参数类型可以用在类,接口和方法中。分别被称为泛型类,泛型接口,泛型方法**。
参数化类型:1、把类型当做是参数一样传递。2、数据类型只能是引用类型。
泛型的好处
- 代码可读性更好,不用强制转换类型。
- 程序更加安全,只要编译器没有警告,运行时期就不会出现ClassCastException异常
类型擦除
编码时采用泛型写的类型参数,编译器会在编译时去掉,这称之为“类型擦除”。泛型主要用于编译阶段,编译后生成的字节码文件不包括泛型中的类型信息,涉及类型转换仍然是普通的强制性类型转换,类型参数在编译后会被替换成Object,运行时虚拟机并不知道泛型。
泛型的使用
定义泛型
泛型标记 | 对应单词 | 说明 |
---|---|---|
E | Element | 在容器中使用,表示容器中的元素 |
T | Type | 表示普通的JAVA类 |
K | Key | 表示键,例如Map中的键Key |
V | Value | 表示值 |
N | Number | 表示数值类型 |
? | 表示不确定的JAVA类型 |
泛型类
泛型类就是把泛型定义在类上,用户使用该类的时候,才把类型明确下来。泛型类的具体使用方法是在类的名称后面添加一个或多个类型参数声明,如,<T,K,V>
//泛型类
public class Generic<T> {
private T data;
public void setData(T data) {
this.data = data;
}
public T getData() {
return data;
}
}
public class Test {
public static void main(String[] args) {
//假如没有设定占位符,则set方法中的参数 默认是Object类型
Generic<String> generic = new Generic<>();
generic.setData("admin");
String data = generic.getData();
System.out.println(data);
Generic<Integer> generic1 = new Generic<>();
generic1.setData(54);
Integer flag = generic1.getData();
System