Java泛型方法通过在返回类型前声明类型参数(如<T>)实现多类型适配与编译期类型安全,不依赖所在类是否为泛型类;支持多参数、边界限制、自动推断及显式指定。

Java 中泛型方法通过在方法声明前添加类型参数(如 <T>)来实现,使方法能适配多种类型,同时保留编译期类型安全。
泛型方法的基本写法
泛型方法的类型参数写在返回类型之前,用尖括号包裹。它不依赖于所在类是否为泛型类。
- 语法格式:
public <T> T methodName(T param) { ... } - 类型参数可有多个,如
<K, V>,也可带边界限制,如<T extends Comparable<T>> - 返回类型可以是泛型类型、具体类型,也可以是 void
常见泛型方法示例
以下是一些实用且易理解的泛型方法写法:
-
简单类型转换封装:
public <T> T getFirst(List<T> list) { return list != null && !list.isEmpty() ? list.get(0) : null; } -
带上限约束的方法:
public <T extends Number> double sum(T a, T b) { return a.doubleValue() + b.doubleValue(); } -
泛型数组创建(需绕过类型擦除):
public <T> T[] newArray(Class<T> type, int size) { @SuppressWarnings("unchecked") T[] arr = (T[]) new Object[size]; return arr; }
泛型方法的调用方式
泛型方法调用时,类型参数通常由编译器自动推断,无需显式指定;但必要时也可手动传入。
立即学习“Java免费学习笔记(深入)”;
-
自动类型推断(最常用):
String first = getFirst(Arrays.asList("a", "b"));→ 编译器推断T为String -
显式指定类型(用于推断失败时):
Number n = Util.<Integer>sum(1, 2);(假设方法在工具类Util中) -
静态泛型方法调用更灵活:无论类是否泛型,静态泛型方法都可直接通过类名调用,如
Collections.<String>emptyList()
注意事项与常见误区
编写和使用泛型方法时,有几个关键点容易出错:
- 泛型方法的类型参数作用域仅限该方法,不能用于类成员变量或类级别逻辑
- 不能用泛型类型创建实例:
new T()是非法的,需借助Class<T>参数或工厂对象 - 基本类型不能作为类型实参(如
<int>),只能用包装类(<Integer>) - 若方法签名中未出现类型参数(如
public <T> void foo() {...}),则无法推断T,必须显式指定


















