泛型方法的核心是将类型作为参数,通过<T>声明类型占位符,支持调用时自动类型推断或显式指定,具备高复用性与类型安全性,且不依赖所在类是否为泛型。

泛型方法的核心是把类型当成参数来用,不是写死某一种类型,而是留个占位符,调用时再填具体类型。它不依赖所在类是否泛型,独立性强,复用度高。
定义泛型方法的语法结构
必须在返回值类型前加 <T>(或多个类型参数,如 <T, U>),T 是类型参数名,可任意命名(常用 T、E、K、V),但不能和已有类型或变量名冲突。
- 正确写法:public static <T> T getValue(T input) { return input; }
- 错误写法:public static void<T> doWork() {...}(<T> 位置错,不能放在 void 后)
- 错误写法:public static T<T> create() {...}(返回值类型不能带 <T>)
调用泛型方法的两种方式
编译器支持类型推断,但推断依据只有实参,不看返回值类型。所以有参时通常可省略显式标注,无参时必须写明。
- 靠参数自动推断:String s = getValue("hello"); → 编译器识别传入 string,T 就是 string
- 整数同理:int n = getValue(42); → T 推为 int
- 无参方法必须显式指定:String def = getDefault<String>();(否则报 CS0411)
- 构造对象也需显式:new Repository<User>(conn);(构造函数参数不触发推断)
泛型方法里的类型约束怎么加
如果方法里要调 new()、CompareTo 或 as 操作,就得加 where 约束。约束顺序不能乱:class/struct 必须最前,new() 必须最后,接口居中。
- 允许实例化:public static <T> T CreateNew<T>() where T : new() { return new T(); }
- 限定为引用类型并实现接口:public static <T> int Compare<T>(T a, T b) where T : class, IComparable { return a.CompareTo(b); }
- 错误顺序示例:where T : IComparable, class → 编译报错,class 没放最前
常见误区提醒
泛型方法的 T 只在本方法内有效,不能被同级其他方法或属性使用;属性和索引器也不能声明自己的泛型参数,只能用类级泛型。
- 方法内不能用外层类的 T,除非该类本身是泛型且已声明 T
- 不能只靠返回值类型推断 T,比如 <T> T getDefaultValue() 调用时必须写 getDefaultValue<string>()
- Java 中还需额外传 Class<T> 参数来绕过类型擦除,C# 不需要——这是关键差异


















