泛型方法通过在返回类型前声明类型参数(如<T>)实现类型安全复用,支持自动类型推断与显式指定,需用边界限定约束操作,且受类型擦除限制。

Java 泛型方法的定义和调用,核心就两点:在方法签名里声明类型参数,再让编译器根据实参自动推断或你手动指定具体类型。它不依赖类是否泛型,也不改变类结构,只解决“一个逻辑适配多种类型”的问题。
怎么定义泛型方法
泛型方法的类型参数写在返回类型前面,用尖括号 <T> 包裹。T 只是占位符,可换成 U、V 或更有意义的名字(如 <Item>)。
- 静态或实例方法都能定义,比如:public static <T> void print(T value)
- 可以有多个类型参数:public <K, V> Map<K, V> createMap()
- 能结合边界限定:public <T extends Comparable<T>> T max(T a, T b),表示 T 必须实现 Comparable
- 注意区分:如果只是用了类上声明的泛型(如 class Box<T> { void set(T t) {} }),这不算泛型方法;只有带 <...> 前缀的才是
怎么调用泛型方法
绝大多数情况靠编译器自动推断——你照常传参,它自己算出 T 是什么类型。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 自动推断示例:print("hello") → T 推为 String;print(42) → T 推为 Integer
- 需要显式指定的情况:当参数无法提供足够信息时,比如调用无参泛型方法 <T> List<T> emptyList(),就得写成 Util.<String>emptyList()
- 数组操作中也常见推断:swap(arr, 0, 1) 中 arr 是 String[],T 就是 String
什么时候必须加类型边界
不是所有泛型方法都要加 extends 或 super,但当你需要在方法内调用某个类型特有的方法时,就必须约束它。
立即学习“Java免费学习笔记(深入)”;
- 要调用 .toString()?不用加——Object 有,所有类型都满足
- 要调用 .compareTo()?得加 <T extends Comparable<T>>
- 要往集合里 add 元素且希望兼容父类型?用下界:public static <T> void addNumbers(List<? super Number> list),这样传 List<Object>、List<Number> 都行
常见误区提醒
泛型是编译期特性,运行时擦除。这意味着:
- 不能用 if (T == String.class) 判断类型——T 已不存在
- 不能创建泛型数组:new T[10] 编译报错(可用 Object[] + 强转绕过,但需谨慎)
- 不能在 catch 中捕获泛型异常:catch (T e) 不合法
- 通配符(?)和方法级泛型(<T>)用途不同:? 多用于变量/参数声明,<T> 用于定义可复用的行为逻辑

















