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

Java 泛型方法的定义和调用,核心就两点:在方法签名里声明类型参数,再让编译器根据实参自动推断或你手动指定具体类型。它不依赖类是否泛型,也不改变类结构,只解决“一个逻辑适配多种类型”的问题。
怎么定义泛型方法
泛型方法的类型参数写在返回类型前面,用尖括号
- 静态或实例方法都能定义,比如:public static
void print(T value) - 可以有多个类型参数:public
Map createMap() - 能结合边界限定:public
> T max(T a, T b) ,表示 T 必须实现 Comparable - 注意区分:如果只是用了类上声明的泛型(如 class Box
{ void set(T t) {} } ),这不算泛型方法;只有带 <...> 前缀的才是
怎么调用泛型方法
绝大多数情况靠编译器自动推断——你照常传参,它自己算出 T 是什么类型。
- 自动推断示例:print("hello") → T 推为 String;print(42) → T 推为 Integer
- 需要显式指定的情况:当参数无法提供足够信息时,比如调用无参泛型方法
List ,就得写成 Util.emptyList() emptyList() - 数组操作中也常见推断:swap(arr, 0, 1) 中 arr 是 String[],T 就是 String
什么时候必须加类型边界
不是所有泛型方法都要加 extends 或 super,但当你需要在方法内调用某个类型特有的方法时,就必须约束它。
- 要调用 .toString()?不用加——Object 有,所有类型都满足
- 要调用 .compareTo()?得加
> - 要往集合里 add 元素且希望兼容父类型?用下界:public static
void addNumbers(List super Number> list) ,这样传 List
常见误区提醒
泛型是编译期特性,运行时擦除。这意味着:
- 不能用 if (T == String.class) 判断类型——T 已不存在
- 不能创建泛型数组:new T[10] 编译报错(可用 Object[] + 强转绕过,但需谨慎)
- 不能在 catch 中捕获泛型异常:catch (T e) 不合法
- 通配符(?)和方法级泛型(
)用途不同:? 多用于变量/参数声明, 用于定义可复用的行为逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











