Java泛型方法需在返回类型前显式声明类型参数(如<T>),使方法适配多种引用类型并保留编译期类型检查;支持extends限定边界、通配符增强兼容性,但不可用于基本类型或返回值类型。

Java 中定义泛型方法,核心是在方法签名中**显式声明类型参数**(如
泛型方法的基本写法
在返回类型前加
- 语法格式:public <T> T methodName(T param)
- T 是占位符,调用时由编译器根据实参自动推断(如传入 new String[]{"a"} → T 推为 String)
- 不能用于基本类型,int 要写成 Integer;但数组、泛型集合可直接用,如 List<T>、T[]
- 示例:获取数组首元素
public <T> T getFirst(T[] arr) { return arr == null || arr.length == 0 ? null : arr[0]; }
用 extends 添加类型约束提升实用性
裸 T 功能有限,加上边界限定后才能调用共通方法,比如比较、转换或序列化:
- <T extends Comparable<T>>:保证 T 支持 compareTo(),可用于排序或找最大值
- <T extends Serializable & Cloneable>:要求 T 同时实现两个接口,适合缓存或深拷贝场景
- 示例:安全的最小值查找
public <T extends Comparable<T>> T min(List<T> list) { return list.stream().min(Comparable::compareTo).orElse(null); }
区分泛型方法与类泛型的使用场景
不是所有带 T 的方法都是泛型方法——关键看 T 是从哪来的:
立即学习“Java免费学习笔记(深入)”;
- 泛型类里的普通方法(如 class Box<T> { public T getValue() {...} })不是泛型方法,它复用的是类声明的 T
- 真正泛型方法必须自己声明
,哪怕所在类已是泛型(静态方法尤其如此) - 典型用途:工具类方法(Arrays.asList、Collections.sort)、策略型操作(map、filter)、类型转换辅助
- 反例:public static void print(T obj) —— 编译错误,T 未声明
- 正例:public static <T> void print(T obj) —— 正确,T 由方法自己引入
配合通配符增强参数兼容性
当方法只读不修改数据,或需接收子类型集合时,用 ? 比裸 T 更灵活安全:
- List<?>:接受任意 List,但不能 add(除 null),适合遍历打印
- List<? extends Number>:只收 Number 及其子类(Integer、Double),可安全调用 doubleValue()
- List<? super Integer>:可安全 add(Integer),适合向父类集合写入
- 注意:通配符不能用于返回值类型(如不能写 public ? get()),也不支持在方法体中实例化(new ?() 不合法)


















