Java泛型的核心价值是在编译期保障类型安全并避免重复编码;通过类型参数(如Stack<T>)、类型限制(如<T extends Comparable<T>>)、通配符(如<? extends Number>)及规避类型擦除陷阱(如禁用new T())实现。

Java泛型机制的核心价值,就是在不牺牲类型安全的前提下,让同一套数据结构逻辑适配多种类型。它不是靠运行时检查,而是把类型约束前移到编译阶段,既杜绝了ClassCastException,又避免了重复编码。
定义泛型类,封装通用逻辑
从最基础的容器开始,用类型参数
- 声明时用T占位,比如
public class Stack<T>或public class Pair<K, V> - 成员变量、方法参数、返回值统一使用该类型参数,如
private T topElement;、public void push(T item) - 实例化时指定具体类型:
Stack<String> stringStack = new Stack<>();,此时编译器会锁定所有操作只能针对String
利用类型限制(bounded type parameters)增强实用性
当需要调用类型特有的方法时,不能只依赖T,而要限定它的范围:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 用
<T extends Comparable<T>>确保元素可比较,才能实现泛型排序或查找 - 用
<T extends Number>保证能调用doubleValue()等数值方法,适用于统计类工具 - 多个上界可用
&连接,例如<T extends Runnable & Cloneable>
善用通配符提升API灵活性
在方法参数中不绑定死某个具体泛型类型,而是接受更宽泛的类型范围:
立即学习“Java免费学习笔记(深入)”;
-
void printAll(List<? extends Number> list):能接收List<Integer>、List<Double>等,安全读取 -
void addNumbers(List<? super Integer> list):能向List<Number>或List<Object>写入Integer - 避免使用
List<?>修改内容,因为编译器禁止向无界通配符集合添加除null以外的任何元素
注意类型擦除带来的限制
泛型是编译期特性,运行时不存在类型信息,因此需规避以下常见陷阱:
- 不能用
new T()创建实例——改用工厂方法或传入Class<T>对象 - 不能直接判断
if (obj instanceof T)——类型信息已擦除,只能用obj.getClass() == clazz配合传入的Class对象 - 静态上下文中无法访问类型参数——静态方法/字段不能依赖类的
,需声明为泛型方法 <T> static void method(T t)

















