泛型方法通过在返回类型前声明<T>支持多种类型处理,可加extends限定约束、用通配符提升灵活性,但需注意静态方法需独立声明、基本类型需包装、运行时类型擦除等限制。

直接在方法参数里用泛型,能让同一个方法处理多种类型的数据,不用为每种类型单独写一遍逻辑。
泛型方法的基本写法
在返回类型前加 <T> 声明类型参数,再把 T 用在参数、返回值或局部变量中。编译器会根据调用时传入的实际类型自动推断。
- 语法格式:public static <T> 返回类型 方法名(T 参数) { ... }
- 比如交换两个元素:public static <T> void swap(List<T> list, int i, int j),List 里存什么类型,T 就是什么类型
- 调用时无需写明类型:swap(stringList, 0, 1) 或 swap(intList, 0, 1) 都能用
用边界限制增强实用性
光用 T 有时不够——比如想对参数做比较或调用特定方法,就得加约束。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 上界限定:<T extends Comparable<T>> 表示 T 必须能比较大小,这样方法里就能安全调用 compareTo()
- 多个接口:<T extends Runnable & Cloneable> 表示 T 必须同时实现这两个接口
- 实际例子:找最大值方法 public static <T extends Comparable<T>> T max(List<T> list),传 List<String> 或 List<Integer> 都能跑通
配合通配符提升灵活性
当方法只读不改数据,或者要兼容不同子类型时,参数用通配符比裸 T 更合适。
立即学习“Java免费学习笔记(深入)”;
- 无界通配符:printAll(List<?> list) 可接收 List<String>、List<Date> 等任意类型列表
- 上界通配符:processNumbers(List<? extends Number> list) 能处理 List<Integer>、List<Double>,但不能往里 add(除了 null)
- 下界通配符:addIntegers(List<? super Integer> list) 可以安全 add Integer,适用于向父类集合写入
避免常见误区
泛型方法不是万能的,有些地方容易踩坑。
- 静态方法必须自己声明 <T>,不能依赖外部类的泛型参数
- 基本类型不能直接作为类型参数(如 int),得用包装类(Integer)
- 运行时泛型已擦除,所以不能用 if (arg instanceof T) 或 new T(),需通过 Class 对象传递类型信息

















