范型【Java】
简介
泛型的意思是“参数化类型”。参数化类型将之前类方法中具体的类型参数化,运行时再传入具体的类型。
Java的范型可以应用在类、接口和方法中,分别可以被称为泛型类、泛型接口、泛型方法。
原理
编译器检查
Java中泛型的和C++的模版有类似的目的,将通用逻辑和不同数据类型的个性化逻辑进行分离,使用代码更加通用。
泛型可以解决容器的类型安全,使用泛型可以让编译器在编译时借助传入的类型参数检查容器插入/获取的元素类型是否合法,从而将运行时的类型转换错误可以前置到编译时。
使用泛型之后,由于编译器可以知道具体类型,因此编译期会自动进行强制转换,使得代码更加优雅。
运行期擦除
Java 1.5推出的“泛型”,本质上是编译时类型检查的语法糖。
使用范型的代码通过编译器编译后所生成的二进制代码和没有使用范型是完全相同的。
泛型可以将具体的类型作为参数传递给方法,类,接口,在编译时去除这些范型类型的过程称为擦除。
使用
Class范型化
从JDK1.5开始,Class也是范型化类。
Java作为一个比较存粹的面相对象语言,Java所有定义的类的类型信息也有类进行表达,该类就是Class类,Class类的对象就是其他类的类型信息,Object类中的方法getClass()就可以获取一个Class类型的对象,该对象包含了该Object对象的类型信息。
Class范型化之后,范型参数T就代表Class的对象类型,例如String.class类型代表 Class<String>,Serializable.class代表 Class<Serializable>。
Class范型化之后在利用Class类进行反射操作时,可以获取准确的类型,提升反射的运行效率以及安全性。
范型类
泛型类(泛型接口)的声明和和普通类的声明类似,但是范型类/接口的名称后面添加了类型参数的声明部分。
泛型类的类型参数声明部分包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数(例如:E、T、K、V等),也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。
public class GenericClass<T>{
//成员变量
private T t;
public void function(T t){
}
}
范型方法
范型方法声明了参数化的变量类型,泛型类中的使用了泛型的成员方法并不是泛型方法,如get、set。
public class GenericFunction {
public <T> void function(T t) {
}
public <T> T functionTwo(T t) {
return t;
}
}