泛型方法通过在返回类型前声明<T>实现独立于类的跨类型复用,支持类型推断、extends约束(如Comparable)、通配符(? extends Number)及静态方法需自行声明类型参数。

泛型方法通过在返回类型前单独声明类型参数,让方法逻辑脱离所在类的泛型上下文,实现真正独立、跨类型的复用。它不依赖外部类是否泛型,也不绑定某个固定类型,只关注当前方法需要处理的数据契约。
泛型方法的基本定义与调用方式
在方法返回类型前加 <T> 声明类型参数,T 可用于参数、返回值和局部变量。编译器根据实参自动推断类型,无需显式写出。
- 写法示例:public static <T> void printAll(T[] arr),可传入 String[]、Integer[]、LocalDate[] 等任意引用类型数组
- 调用时直接写 printAll(new String[]{"a", "b"}),编译器识别为 printAll<String>
- 若需指定类型(如推断失败或含泛型嵌套),可显式写出:Util.<Number>max(list)
用 extends 添加类型约束提升实用性
仅用 T 无法调用特定方法(如 compareTo、doubleValue)。加上上界约束后,就能安全使用共通行为。
- <T extends Comparable<T>>:保证 T 支持比较,方法内可调用 t1.compareTo(t2)
- <T extends Serializable & Cloneable>:要求 T 同时实现两个接口,支持序列化与克隆
- 实际应用:public static <T extends Number> double sum(List<T> numbers),内部可调用 n.doubleValue()
配合通配符增强参数兼容性
当方法只读取、不修改数据,或需接受多种子类型时,用通配符比裸 T 更灵活且安全。
立即学习“Java免费学习笔记(深入)”;
- List<?>:接收任意 List,但不能 add(除 null),适合遍历、统计等只读操作
- List<? extends Number>:只接受 Number 及其子类(Integer、Double 等),可安全调用 doubleValue()
- List<? super Integer>:只接受 Integer 的父类集合(如 List<Number> 或 List<Object>),可安全 add(Integer)
注意静态方法必须自行声明类型参数
静态方法属于类而非实例,无法访问外部类的泛型参数。即使类本身是泛型,静态泛型方法也必须自己带 <T>。
- 错误写法:public static void wrong(List<T> list)(T 未声明)
- 正确写法:public static <T> void right(List<T> list)
- 常见误区:误以为 class Box<T> 中的静态方法能直接用 T,实际必须重新声明 <T>


















