泛型方法通过在方法签名中声明类型参数实现独立于类的泛型,其类型参数须位于访问修饰符后、返回类型前,作用域仅限该方法内,支持类型推断与多参数及边界约束。

泛型方法能脱离类的泛型定义独立工作,关键在于把类型参数声明在方法签名里,而不是类上。它让一个普通类也能灵活处理多种类型,且多数时候不用手动写类型,编译器自动“看出来”用的是什么类型。
泛型方法的正确声明位置
类型参数必须紧挨着访问修饰符之后、返回类型之前,用尖括号包裹:
- ✅ 正确:
public <t> void print(T item)</t> - ❌ 错误:
public void <t> print(T item)</t>(<t></t>不能放在返回类型后面) - ❌ 错误:
public <t> T getValue() { return cache; }</t>(如果cache是字段,T在这里不可用——泛型参数只在方法体内有效)
类型参数的作用范围和使用限制
<t></t> 只属于这个方法,不能跨方法共享,也不能用于类成员:
- ✅ 可以用在:参数类型(
T x)、返回类型(T get())、局部变量(T temp = x;)、泛型数组(T[] arr = (T[]) new Object[10];)、集合(List<t></t>) - ❌ 不能用在:类字段(
private T data;编译报错)、静态变量、其他方法的签名中
类型推断如何自动生效
编译器会根据传入的实际参数类型决定 T 是什么,不需要每次都写 <string></string> 这样的标注:
- 调用
print("hello")→ 推断T = String - 调用
print(42)→ 推断T = Integer(自动装箱) - 调用
print(new ArrayList<string>())</string>→ 推断T = ArrayList<string></string> - 只有少数情况需显式指定:方法无参数(如
<t> T create()</t>)、参数是null、或多个泛型参数中部分无法从参数推出
多类型参数与边界约束
需要更精确控制时,可声明多个类型参数,并加约束:
- Java 中用
extends限定上界:public <t extends comparable>> T max(T a, T b)</t> - 支持多个参数:
public <k v> Map<k v> createMap()</k></k> - C# 的
where在 Java 里没有对应语法,但extends已覆盖常见需求(如要求实现接口、继承某类)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











