一、何为泛型
泛型,即为广泛的类型。设计了一个泛型类,我们可以往里面填充广泛的类型。在创建的时候只要往里面填充特定的类型,就要得到自己想要的对象。泛型类似于一个瓶子,我们要喝水的往水瓶里面装水就可以得到一瓶矿泉水。我们想喝可乐的时候往瓶子里面转入可乐,便可以得到一瓶可乐。
二、泛型的语法
class Test<T>{
private T parameter;
public Test(){
this.parameter = parameter;
}
public T getParameter(){
return parameter;
}
public void setParameter(T parameter){
this.parameter = parameter;
}
}
这样子便可以在java中定义一个泛型类,使用class Test<Double> = new Test<Double>()便可以创建一个泛型类对象。
class GenericMethodClass{
public static <T> T genericMethod(T a){
}
}
使用这样的语法,便可以创建一个java泛型方法。Double b = 2.0;GenericMethodClass.<Double>genericMethod(b)便可以调用这个方法,也可以直接GenericMethodClass.genericMethod(b)进行,java编译器会自动根据b的类型进行推断调用何种方法。这里为什么要使用Double引用类型而不使用基本类型double呢?就是因为泛型类型参数只能是引用类型,而不能是基本基本类型。
三、泛型在虚拟机中的实现
java虚拟机里面是没有泛型类这个概念的,所有的泛型在虚拟机中都会被用原生类型来代替,这就是所谓的java虚拟机的类型擦除
class Test<T>{
private T parameter;
public T getParameter(){
return parameter;
}
}
这样的一个泛型类在运行的时候,在虚拟机中会被类型擦除成下面这种形式
class Test{
private Object parameter;
public Object getParameter(){
return parameter;
}
}
如果一个泛型的类型T有限定,则会使用限定类型去替换
Class Test<T extends Comparable>{
private T parameter;
public T getParameter(){
return parameter;
}
}
在虚拟机中则会被替换成
Class Test{
private Comparableparameter;
public Comparable getParameter(){
return parameter;
}
}
因为在java虚拟机中存在类型擦除,所以在执行泛型函数的时候,获取泛型类型的变量是自动插入强制类型转换
Test<Double> test = new Test<Double>();
Double a = test.getParameter();
test.getParameter拿到的变量是一个Object类型的,因为变量a是Double类型的,所以在执行这个函数的时候,java虚拟机会自动加入强制类型转换。
四、java泛型的约束
1.泛型的类型参数只能是引用类型的,而不能是基本类型的。
2.不能创建参数化的类型数组
3.因为存在类型擦除,所以在运行时只能进行基本类型的查询判断