泛型方法可在非泛型类中定义,类型参数<T>须置于访问修饰符后、返回类型前;仅限本方法作用域,可用于参数、返回值、局部变量等,不可用于字段;支持多参数及约束(C#用where,Java用extends);调用时通常自动类型推断。

泛型方法可以在非泛型类中直接定义,无需类本身泛型化。关键在于把类型参数写在返回类型之前,并确保它只在本方法作用域内生效。
声明位置必须准确
类型参数要用尖括号 <T> 包裹,紧接在访问修饰符之后、返回类型之前。例如:
public <T> void print(T item) —— 正确
public void <T> print(T item) —— 错误(
public <T> T[] createArray(int size) —— 正确,T 同时用于返回类型和逻辑
类型参数仅限本方法使用
方法中声明的 T 无法被同类其他方法访问,也不能用于字段或静态变量声明:
- ✅ 可用于参数类型、返回类型、局部变量、泛型数组(如 T[])、泛型集合(如 ArrayList<T>)
- ❌ 不可用于类字段:private T cache;(编译报错)
- ❌ 不可在另一个方法里复用同一个 T 名称(即使含义相同,也属不同作用域)
支持多类型参数与约束(以 C# 为例)
当需要更精确控制类型行为时,可声明多个参数并添加约束:
public static TOutput ConvertAll<TInput, TOutput>(TInput[] input) where TOutput : new(), ICollection<TInput>
说明:
- TOutput 必须有无参构造函数,且实现 ICollection<TInput>
- 约束紧跟在参数列表后,用 where 引导
- Java 不支持 where 约束,但可用 extends 限定上界(如 <T extends Comparable<T>>)
调用时优先依赖类型推断
多数场景下不必显式写出类型实参,编译器能从入参自动判断:
print("hello") → 推断 T = String
print(42) → 推断 T = Integer(Java)或 int(C#,经装箱)
显式写法(如 print<String>("hello"))仅在以下情况必要:
- 方法无参数,仅靠返回值类型决定泛型(如 <T> T getDefaultValue())
- 参数为 null,编译器无法推断
- 存在多个泛型参数且部分无法从参数推出

















