Java泛型通过将类型作为参数实现类型安全与通用性:泛型类用<T>定义,要求引用类型实参;泛型方法在返回类型前声明<T>,作用域限于该方法;二者结合广泛用于容器及工具方法。

Java 中泛型类和泛型方法的核心是把类型当成参数来用,让代码更安全、更通用。定义时不写死具体类型,使用时再指定,编译器会帮你检查类型是否匹配,避免运行时出错。
泛型类的定义与使用
泛型类在类名后加 <T>(或多个类型参数,如 <K, V>),其中 T 是类型形参,代表一个待定的引用类型。
- 语法格式:class 类名<T> { ... },T 可在字段、方法参数、返回值、局部变量中使用
- T 只能是引用类型(不能是 int、char 等基本类型),但可传入包装类(Integer、Character)
- 实例化时必须指定具体类型,如 new Box<String>();若省略(如 new Box<>()),编译器会尝试推断,但不推荐省略以保清晰
- 泛型类支持继承:子类可复用父类泛型参数,也可固定某个类型(如 class IntBox extends Box<Integer>)
泛型方法的定义与使用
泛型方法独立于类是否泛型,只要在返回类型前声明类型参数,如 <T> void print(T item)。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 语法格式:修饰符 <T> 返回类型 方法名(参数) { ... },
必须紧挨在返回类型前 - 类型参数作用域仅限该方法,方法内可多次使用 T(如参数、返回值、局部变量)
- 调用时通常无需显式写类型(如 print("hello")),编译器自动推断为 String;特殊场景可用 Utils.<Double>max(a, b) 显式指定
- 静态方法也能是泛型方法,且只能通过泛型方法自身声明的类型参数(不能直接用所在泛型类的 T)
常见误区提醒
容易混淆的是“泛型类里的普通方法”和“真正的泛型方法”。比如下面这个不是泛型方法:
立即学习“Java免费学习笔记(深入)”;
-
public T getValue() { return data; } —— 这里的 T 来自类声明
class Box<T>,方法本身没声明 <T>,所以只是普通方法 - public <T> void set(T value) { ... } —— 这才是泛型方法,它引入了自己专属的 T,与类的 T 无关(可能重名但不冲突)
- 泛型类未指定类型实参(如 new Box())时,等价于 Box<Object>,失去类型约束意义,应避免
为什么这样设计
泛型类适合整个类逻辑围绕一种可变类型展开(如容器类 Box、List);泛型方法适合单个操作需适配多种类型(如工具方法 copy、swap、toArray)。两者结合使用很常见,比如 ArrayList 的 public <T> T[] toArray(T[] a) 就是泛型方法,而 ArrayList 本身是泛型类。

















