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类及其父类。