后端学习总结——Java 泛型
3 min
Java 泛型是 Java 的一个重要的特性。它的核心思想是实现代码的复用,同时保证类型安全。
作用
-
类型安全:泛型允许在编译时进行进行类型检查,确保在使用集合或其他泛型类时,不会出现类行不匹配问题。
-
代码复用:泛型使代码适用于不同类型,减少代码重复,提升可读性和可维护性。
-
消除显式类型转换:泛型允许在编译时指定类型,这样在运行时就不必进行显式类型转换。
应用举例
// 泛型方法
public static <T> void printArray(T[] array) {
...
}
// 集合框架
List<String> list = new ArrayList<>();
list.add("yes"); // 加入string
泛型擦除
泛型信息会在编译阶段之后被删除,并被替换为上界 Object。这是因为在早期 Java 中并没有泛型这一特性,Java 语言开发者这样做也是为了能够让 Java 新版本兼容旧版本,否则已有的 Java 项目和生态等将会受到很大的影响。所以,Java 的泛型是伪泛型。
另外,需要注意的是,Java 的泛型只支持引用数据类型(如 Integer,String),不支持基本数据类型,要不然在擦除泛型是如何变成上界 Object。
泛型的上下界定符
用于对泛型类型参数进行范围界定,分为上界定符和下界定符
上界限定符(? extends T)
表示泛型类型只能是 T 或者 T 的子类,这种情况通常用于读取操作。
public void process(List<? extends Number> list) {
Number num = list.get(0);
}
下界限定符(? super T)
表示泛型类型只能是 T 或者 T 的父类,这种情况通常用于写入操作,确保可以安全地向集合中插入 T 类型的对象。
public void addToList(List<? super Integer> list) {
list.add(1);
}
使用场景
-
上界限定符:用于协变(Convariance)场景。协变指的是子类型可以替换父类型,允许我们对泛型进行只读操作,能够返回更具体的类型。
-
下界限定符:用于逆变(Contravariance)场景。逆变指的是父类型可以替代子类型,允许我们对泛型进行写入操作,能够实现更广泛的类型输入,但不保证能读取到类型。
泛型的好处
-
提高代码的可读性。
-
可以在编译时检查类型安全,增强程序的健壮性。
-
避免了强制类型转换的麻烦。
-
提高代码的复用率。