Java泛型方法通过在返回类型前声明<T>实现,可独立于类泛型存在,支持类型推断、边界限定及静态使用,所有检查在编译期完成。

Java 中实现泛型方法,核心是在方法声明中显式引入类型参数,用尖括号
泛型方法的基本语法
格式统一为:修饰符 <T> 返回类型 方法名(参数列表)。其中 T 是类型形参名(也可用 E、K、V 等),仅在该方法作用域内有效。
-
T 可用于参数类型:如
T[] array、List<T> list -
T 可用于返回类型:如
public T getFirst(List<T> list) - T 可用于方法体内部变量或逻辑:如做类型判断、构造泛型对象等
在普通类中定义泛型方法
无需类本身带泛型,直接写即可:
public class Utils {
// 泛型方法:打印任意类型数组
public <T> void print(T[] arr) {
for (T item : arr) {
System.out.print(item + " ");
}
System.out.println();
}
// 泛型方法:返回数组第一个元素
public <T> T first(T[] arr) {
return arr == null || arr.length == 0 ? null : arr[0];
}
}
调用时无需写 <String>,编译器自动识别:
立即学习“Java免费学习笔记(深入)”;
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
Utils u = new Utils();
u.print(new String[]{"a", "b"}); // 推断 T = String
u.print(new Integer[]{1, 2, 3}); // 推断 T = Integer
String s = u.first(new String[]{"x"}); // 返回 String,无强制转换
在泛型类中定义泛型方法
类已有类型参数(如 class Box<T>),其内部泛型方法可复用该 T,也可声明新参数(如 <U>):
class Box<T> {
private T value;
// 复用类的 T
public T getValue() { return value; }
// 声明独立类型参数 U
public <U> void copyTo(List<U> target, U newItem) {
target.add(newItem);
}
}
注意:方法的 <U> 和类的 T 互不影响,各自独立推断。
带边界限制的泛型方法
用 extends 限定类型参数的上界,增强类型安全和可用操作:
-
<T extends Comparable<T>>:T 必须实现 Comparable,可调用compareTo() -
<T extends Number>:T 是 Number 或其子类,可调用doubleValue()等
public <T extends Comparable<T>> T max(T a, T b) {
return a.compareTo(b) >= 0 ? a : b;
}
// 调用合法:max(3, 5)、max("x", "y")
// 调用非法:max(new Object(), new Object()) —— 编译不通过
静态泛型方法必须显式声明类型参数
静态方法不能访问类的类型参数(因类泛型在实例化时才确定),所以静态泛型方法一定要自己带 <T>:
public class CollectionsUtil {
// ✅ 正确:静态方法自带 <T>
public static <T> List<T> singletonList(T item) {
return Arrays.asList(item);
}
// ❌ 错误:若类是泛型类,静态方法不能直接用类的 T
// public static List<T> wrong() { ... } // 编译报错
}
泛型方法本质是“一次编写、多处适配”,关键在于类型参数声明位置和边界控制,不需要运行时支持,所有检查都在编译期完成。

















