转载链接 https://blog.csdn.net/Beyondczn/article/details/107093693
一、什么是泛型
1.背景:
JAVA推出泛型以前,程序员可以构建一个元素类型为Object的集合,该集合能够存储任意的数据类型对象,而在使用该集合的过程中,需要程序员明确知道存储每个元素的数据类型,否则很容易引发ClassCastException异常。
有无泛型的差异 对比无泛型与有泛型的差异
特性 | 无泛型集合 | 有泛型集合 |
---|---|---|
元素类型 | 默认object | 可指定具体类型 |
类型安全 | 运行时可能报错ClassCastException | 编译时需要检查类型 |
代码简洁程度 | 需要强制类型转换 | 直接操作具体类型 |
解决问题
1. 避免类型转换陷阱
在无泛型时,集合默认存储Object类型元素,取出时需强制转换:
List<Object> list = new ArrayList<>();
list.add(1);
String s = (String) list.get(0); // 抛出 ClassCastException
list.add("1");
String s = (String) list.get(1); // 不抛出 ClassCastException
使用泛型后,类型明确,无需强制转换:
List<String> list = new ArrayList<>();
String s = list.get(0); // 直接获取 String 类型
2.提升代码复用性
泛型类/接口可适配多种数据类型。例如,HashMap<K, V>中的K和V可分别指定为String和Integer,实现不同键值对的存储:
Map<String, Integer> map = new HashMap<>();
2.概念:
Java泛型(generics)是JDK5中引入的一个新特性,泛型提供了编译时类型安全监测机制,该机制允许我们在编译时检测到非法的类型数据结构。泛型的本质就是参数化类型,也就是所操作的数据类型被指定为一个参数。
参数化类型
泛型通过类型形参(如
// 类型形参 E 代表未知元素类型
public class ArrayList<E> { ... }
// 类型实参 String 指定具体存储类型
ArrayList<String> strList = new ArrayList<>();
编译时类型检查
泛型在编译阶段即可检查类型是否匹配。例如,若ArrayList
3.好处:
类型安全 消除了强制类型的转换
4.类型:
类型形参与实参的命名规范
E - Element (在集合中使用,因为集合中存放的是元素)元素类型,例如:Iterator
类型上限与通配符
可通过extends指定类型上限(如
通过extends指定类型上限
在 Java 中,通过extends关键字指定类型上限(如
- 泛型类型参数:在泛型类、接口或方法中,使用<>括起来的标识符(如E)称为泛型类型参数。它可以在类、接口或方法的定义中代表一种未知的类型。
- extends关键字:用于指定泛型类型参数的上限,即限制该类型参数必须是某个类或接口的子类。
- 类型上限约束:
表示类型参数E必须是Number类或其子类。这意味着在使用该泛型的地方,只能传入Number类及其子类的实例。 例如,假设
回复