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

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











