JAVA 学习笔记之泛型

98 阅读2分钟

为什么需要泛型?

泛型:参数化类型

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

类型擦除在方法重载时,过不去

截图.png