泛型的本质就是“数据类型的参数化”。 可以把“泛型”理解为数据类型的一个占位符(形式参数),即告诉编译器,在调用泛型时必须传入实际类型。
public class FanXing01 {
public static void main(String[] args) {
//<String>表示泛型类型为String(类似实参),只接受String类型的参数
Meth<String> meth=new Meth<>();
meth.setMeth("gakki",0);
meth.setMeth("yui",1);
meth.setMeth("Ara",2);
String str=meth.getMeth(0);
System.out.println(str);
}
}
class Meth<E>{//此处加入了一个泛型(类似形参,未知的数据类型)
Object[] obj=new Object[5];
public void setMeth(E e,int index){
obj[index]=e;
}
public E getMeth(int index){
return (E) obj[index];
}
}
泛型类型变量不能是基本数据类型。
就比如,没有ArrayList<double>,只有ArrayList<Double>。因为当类型擦除后,ArrayList的原始类中的类型变量(T)替换为Object,但Object类型不能存储double值。
泛型在静态方法和静态类中的问题
泛型类中的静态方法和静态变量不可以使用泛型类所声明的泛型类型参数。
public class Test2<T> {
public static T one; //编译错误
public static T show(T one){ //编译错误
return null;
}
}
因为泛型类中的泛型参数的实例化是在定义泛型类型对象(例如ArrayList<Integer>)的时候指定的,而静态变量和静态方法不需要使用对象来调用。对象都没有创建,如何确定这个泛型参数是何种类型,所以当然是错误的。
public class Test2<T> {
public static <T>T show(T one){//这是正确的
return null;
}
}
public class Test06<Integer> {
static int a=10;
//static Integer a=10; 编译错误
static <Integer>Integer show(Integer b){
return b;
}
}
因为这是一个泛型方法,在泛型方法中使用的T是自己在方法中定义的T,而不是泛型类中的T。