为什么需要泛型?
泛型:参数化类型
1、多种数据类型,执行相同代码
2、实现过程中,可以直接指定类型,在编译期就进行了处理
如何定义一个泛型类?
泛型类
public class ImplGenertor<T> implements Genertor<T> {
@Override
public T next() {
return null;
}
}
泛型方法
public <T> T genericMethod(T...a){
return a[a.length/2];
}
返回值变成参数化类型,必须有一个才是泛型方法
这些都不是泛型方法
public Generic(T key) {
this.key = key;
}
//虽然在方法中使用了泛型,但是这并不是一个泛型方法。
//这只是类中一个普通的成员方法,只不过他的返回值是在声明泛型类已经声明过的泛型。
//所以在这个方法中才可以继续使用 T 这个泛型。
public T getKey(){
return key;
}
限定类型变量
限定T必须有变量的声明,使用extends去实现
public static <T extends ArrayList&Comparable> T min(T a, T b){
if(a.compareTo(b)>0) return a; else return b;
}
泛型类中的约束
1、不能用基本类型实例化类型参数,数组也不可以
2、静态方法,静态域不能使用泛型,虚拟机无法识别泛型T, 静态方法本身是泛型方法,可以实现
3、所有基本类型都不可以,包装类可以
4、运行时类型只适应于原始类型
5、不能实例化变量
无限定的通配符 ?
对类型没有什么限制 用 ?
ArrayList al=new ArrayList(); 指定集合元素只能是 T 类型
ArrayList al=new ArrayList();集合元素可以是任意类型,这种没有意义,
一般是方法中,只是为了说明用法。
泛型类型的继承规则
? extends X 表示类型的上界,类型参数是 X 的子类(包括类本身)
? super X 表示类型的下界,类型参数是 X 的超类(包括X本身)
拟机如何实现泛型?
类型擦除: 将泛型T擦除成Object类型,伪泛型
JDK里将泛型继承的东西强转成擦除的类型
public static void main(String[] args) {
Map<String,String> map = new HashMap<>();
map.put("mark","18");
System.out.println(map.get("mark"));
}
JDK泛型擦除对其进行强转,map就擦除成(String) map
无参数类型擦除成object
类型擦除在方法重载时,过不去