泛型(Generics)
泛型是JDK1.5以后增加的,帮助我们建立类型安全的集合。
本质就是“数据类型的参数化”,处理的数据类型不是固定的,而是可以作为参数传入。可以把泛型理解为数据类型的一个占位符(类似形式参数),即告诉编译器在调用泛型时必须传入实际类型。这种参数类型可以在用类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。
参数化类型:
把类型当作是参数一样传递。
<数据类型>只能是引用类型。
泛型的好处
在不使用泛型的情况下,可以使用Object类型来实现任意的参数类型,但是在使用时需要强制进行类型转换。这就需要程序员明确知道实际类型,不然可能会引起类型转换错误。但一般在编译期间我们无法识别这种错误,只能在运行期间发现这种错误。使用泛型的好处就是可以在编译期间就识别出这种错误,有了更好的安全性。同时,所有类型转换由编译器完成,在程序员看来都是自动转换的,提高了代码的可读性。
总的来说:
代码可读性更好。(不用强制转换)
程序更加安全。
类型擦除
编码时采用泛型写的类型参数,编译器会在编译时去掉,这称之为“类型擦除”。泛型主要用于编译阶段,编译后生成的字节码class文件不包含泛型中的类型信息,涉及类型转换仍是普通的强制类型转换。类型参数在编译后会被替代成Object,运行时虚拟机并不知道泛型。泛型主要是方便程序员的代码编写,以及更好的安全性检测。
泛型的使用
定义泛型
泛型字符可以是任何标识符,一般采用几个标记:
泛型标记 | 对应单词 | 说明 |
---|---|---|
E | Element | 在容器中使用,表示容器中的元素 |
T | Type | 表示普通的Java类 |
K | Key | 表示键,例如:Map中的键Key |
V | Value | 表示值 |
N | Number | 表示数值类型 |
? | 表示不确定的JAVA类型 |
泛型类
泛型类就是把泛型定义在类上,用户使用该类的时候,才把类型明确下来。泛型类的具体使用方法是在类的名称后添加一个或多个类型参数声明,如:、<T,K,V>
语法结构
public class 类名<泛型表示符号> {
}
示例:
public class Generic <T>{
private T flag;
public void setFlag(T flag) {
this.flag = flag;
}
public T getFlag() {
return this.flag;
}
}
public class TestGeneric {
public static void main(String[] args) {
Generic<String> generic = new Generic<>();
generic.setFlag("admin");
String flag = generic.getFlag();
System.out.println(flag);
Generic<Integer> generic1 = new Generic<>();
generic1.setFlag(100);
Integer flag1 = generic1.getFlag();
System.out.println(flag1);
}
}