泛型方法的核心作用是让工具逻辑安全适配多种类型,避免重复代码和牺牲编译期检查;通过声明类型参数,方法体统一使用t,支持类型推断、边界约束(如extends comparable)及运行时擦除限制。

泛型方法的核心作用,是让一个工具逻辑能安全适配多种类型,不用为每种类型写重复代码,也不用牺牲编译期检查。
泛型方法怎么写?关键在声明和参数类型绑定
把类型当成方法的“输入参数”,写在返回值前面;方法体里所有涉及该类型的变量、参数、返回值,都统一用这个
- 声明格式:public static
T methodName(T param) { ... } - T不是固定类名,而是编译器自动推断的“实际类型”,比如传String就推为String,传User就推为User
- 方法内部无需强转,返回值直接就是T类型,调用方接收时也无需转型
常见工具场景:查找、转换、比较,一行代码搞定多类型
比如取列表第一个元素,传统方式要写三个重载方法;用泛型方法,只写一次:
- List
names = Arrays.asList("Alice", "Bob"); String s = first(names); // 直接得String - List
nums = Arrays.asList(10, 20); Integer i = first(nums); // 直接得Integer - 如果传入List
却试图赋给Integer变量,编译直接报错,不会等到运行时崩溃
加边界约束:当需要调用特定方法时,明确限定能力范围
不是所有类型都能做比较或序列化。这时候用 extends 给T加限制,告诉编译器“这个T至少得有XX能力”:
public static- String、Integer、LocalDate 等实现了 Comparable 的类型可以安全调用
- 如果传入 List
- 约束不是可选装饰,而是类型契约——它让API意图清晰,也避免运行时 UnsupportedOperationException
注意擦除带来的限制:运行时拿不到具体T类型
Java泛型在编译后会擦除T,变成Object。所以这些操作在泛型方法里不可行:
- 不能用 instanceof 判断 T 是不是 String(只能判断是不是某个具体类)
- 不能 new T() 创建实例(类型信息已丢失)
- 不能在方法内直接写 if (T.class == String.class) 这类逻辑
- 如需运行时类型信息,得额外传入 Class
参数,比如 public static T fromJson(String json, Class clazz)











