在 Java 中,泛型机制主要解决哪些问题?请说明其核心作用和典型使用场景。
考察说明
考查对 Java 泛型核心价值(类型安全、代码复用)及实现原理的理解。
回答思路
- 【回答框架 1】泛型是 JDK 5 引入的参数化类型机制,核心作用是编译期类型检查,将运行时强转错误提前到编译期,避免 ClassCastException。它实现算法与数据类型的解耦,提高代码复用性,如集合框架 List<T>、Map<K,V> 等。
- 【回答框架 2】泛型典型场景包括:集合类声明、泛型方法、泛型类与接口。泛型通过类型擦除实现,编译后类型参数被替换为 Object 或限定边界(如 extends Number),并自动插入强转,因此运行时无泛型类型信息。
- 【回答框架 3】类型擦除带来限制:不能实例化 T 对象、不能创建 T 数组、静态字段不能使用类型参数等。通配符 ? extends 和 ? super 用于解决泛型协变与逆变问题,配合 PECS 原则(Producer extends, Consumer super)正确设计。
- 【回答框架 4】泛型与重载存在边界:不能通过泛型参数不同来重载,因为擦除后签名相同。同时,原始类型(如 List)会绕过检查,使用时需注意兼容性与潜在类型安全问题。
- 【关键点 1】编译期类型安全,减少强制类型转换
- 【关键点 2】类型擦除机制,运行时无泛型信息
- 【关键点 3】通配符解决协变与逆变,PECS 原则
- 【关键点 4】泛型不能用于重载的签名区分
- 【易错点 1】不能直接创建 T 类型实例或数组,需要使用反射或 ArrayList 等包装
- 【易错点 2】泛型与原始类型混用可能触发 unchecked 警告,并破坏类型安全
- 【易错点 3】静态上下文不能使用类类型参数,因为擦除后无实际类型