静态方法不能使用类泛型参数,但可声明独立的泛型方法,格式为public static <U> U methodName(U param),<U>需置于修饰符后、返回类型前,U可用于参数、返回值等;若需约束类型,须在声明处用extends限定,如<N extends Number>;调用时支持类型推断或显式指定。

静态方法不能用类声明的泛型参数(比如 class Box<T> 中的 T),是因为静态成员属于类本身,而类泛型参数只在实例化时才确定,两者作用域不重合。但你可以让静态方法自己“带”泛型——不是复用类的 T,而是**在方法签名上显式声明一个全新的类型参数**。
在方法返回类型前加尖括号声明
这是最直接、最标准的做法。语法格式是:public static <U> U methodName(U param)。这里的 <U> 是方法专属的类型形参,和外围类是否泛型、叫什么名字完全无关。
-
必须写在修饰符之后、返回类型之前,缺一不可。漏掉
<U>就不是泛型方法,编译会报错 -
U可以任意命名(推荐用TItem、K、V等,避免和类泛型名重复) - 声明后,
U可用于参数类型、返回类型、局部变量,甚至泛型集合:List<U>
不要和类泛型同名,防止遮蔽与混淆
如果类本身是泛型(如 class Processor<T>),静态方法再写 public static <T> void handle(T item),虽然语法通过,但方法里的 T 已经不是类的 T,而是新声明的局部参数——容易误导维护者。
- 建议统一用不同名称,比如
<Input>、<Result>、<Key> - 这样调用时语义更清晰:
Utils.parse<Integer>("123")比Utils.parse<T>("123")更易懂
类型约束要写在方法声明里,不能放在参数中
如果需要限定类型范围(比如只能是 Number 子类),上限必须定义在类型参数声明处:
立即学习“Java免费学习笔记(深入)”;
- ✅ 正确:
public static <N extends Number> double sum(N a, N b) - ❌ 错误:
public static <N> double sum(N a, N b) where N : Number(Java 不支持这种写法) - 多个约束用
&连接:<T extends Comparable<T> & Serializable>
调用时类型可推断,也可显式指定
编译器通常能根据实参自动推断类型,但遇到歧义或需明确语义时,支持显式传入:
- 自动推断:
CollectionUtils.asList("a", "b", "c")→ 推出<String> - 显式指定:
JsonUtil.<user>parse(jsonStr)</user>,尤其适合返回值类型模糊时 - 泛型数组创建仍受限:不能写
new U[10],需改用Array.newInstance(U.class, 10)或用List<U>


















