Java 泛型

1. 什么是泛型

  泛型指的是定义类、接口、方法的时候不局限于某种特定类型,而是让类、接口、方法的调用者决定使用哪种类型。

  泛型的本质是参数泛型化或者参数多态的应用,可以将泛型参数(操作的数据类型)作为方法签名中的一种特殊类型。泛型能够应用在类、接口、方法,就是泛型类、泛型接口、泛型方法。

  针对泛型化的数据类型使用不同数据类型编写相同的算法,加强系统数据类型和方法抽象化。

2. 什么是方法签名

  方法声明两部分组成方法签名:方法的名称 + 方法的所有参数类型 = 方法签名;

3. 泛型实现机制

  泛型擦除分为:泛型擦除编译处理细节、泛型擦除运行影响、泛型擦除反射影响。

  1. 泛型的类型擦除有哪些好处?

    1. 运行时内存负担小。

    2. 兼容性好。

  2. 泛型类型擦除有哪些问题?

    1. 基本数据类型无法做为泛型实参,而是使用包装器类型,比如:Integer、String等。所以,Java泛型在些处有性能消耗。不过,在Android中Google提供SparseArray解决些问题。

    2. 泛型类型无法用作方法重载。

    3. 泛型类型无法当做真实类型使用,这也是为什么方法中使用泛型,参数还要传类型原因。但是,可以用于其它泛型类型,如:new ArrayList<T>()

    4. 静态方法无法引用类泛型参数,但是,静态方法声明泛型类型参数,可以在静态方法中使用。

public class SuperClass<T> {

    // 静态方法无法引用类泛型参数
    public static T test(T param) {}

    // 但是,静态方法声明泛型类型参数,再在静态方法中使用。
    public static <R> R test(R param) {}
    
}

    5. 泛型类型在类型强转运行时开销。

  3. 泛型签名(写框架使用)

  泛型类型签名信息在特定场景下反射可获取。getGenericReturnType()

  泛型签名在运行时附加上去的,只影响反射。对其它不影响。通过反射获取泛型签名。

4. 在泛型中的上界通配符和下界通配符

 (一)<?>或者<T> 等同于<? extends Object>

 (二)上界通配符(<? extends ClassA>)

    特性:只能取数据,不能存数据,即只能get,不能set。

    限定范围:包括ClassA类及其子类(派生类)。

 (三)下界通过符(<? super ClassB>)

    特性:能取/存数据,但是,返回数据类型是Object类型,要做二次强转。

    限定范围:包括ClassB类及其父类。

posted @ 2021-10-15 10:43  naray  阅读(64)  评论(0编辑  收藏  举报