泛型类通过在类名后声明类型参数(如<T>)实现编译期类型安全与多类型复用;必须在定义时使用T声明字段/方法,在实例化时指定具体引用类型(如Box<String>),禁用基本类型和原始类型。

Java 泛型类通过在类定义时声明类型参数,实现“一次编写、多种类型复用”,同时保障编译期类型安全。关键不在写得多,而在写得准——类型参数要声明、字段方法要用上、实例化时要指定具体类型。
泛型类怎么写:声明 + 使用类型参数
泛型类的定义必须在类名后加 <T>(或 <E>、<K, V> 等),其中 T 是类型变量,代表未来传入的具体引用类型:
- 类型变量习惯用大写单字母:T(Type)、E(Element)、K/V(Key/Value)
- 类中所有涉及该类型的成员变量、方法参数、返回值,都直接使用 T,而不是 Object
- 不能用基本类型(如 int、char)作为类型实参,但可用其包装类(Integer、Character)
示例:
public class Box<T> {
private T content;
public void setContent(T content) {
this.content = content;
}
public T getContent() {
return content;
}
}
泛型类怎么实例化:指定具体类型 + 菱形语法
创建对象时,必须在类名后明确写出实际类型(即类型实参),Java 7+ 支持菱形语法 <> 让编译器自动推断:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
- 正确写法:
Box<String> box1 = new Box<>();或Box<Integer> box2 = new Box<Integer>(); - 错误写法:
Box<int> box = new Box<>();(基本类型不合法) - 不推荐写法:
Box box = new Box();(原始类型,失去泛型保护,等同于没用泛型)
此时 box1.setContent("ok") 合法,box1.setContent(123) 编译直接报错。
进阶要点:边界约束与多类型参数
当需要限制泛型能接受的类型范围,或处理更复杂结构时:
- 上界约束:
class NumberBox<T extends Number>表示 T 只能是 Number 或其子类(如 Integer、Double) - 多类型参数:
class Pair<K, V>支持键值对场景,如Pair<String, Integer> - 不能创建泛型数组:
T[] arr = new T[5];编译失败;可用Object[]转型或用ArrayList<T>替代
为什么必须这样写和实例化?
泛型本质是编译期机制:它把类型检查提前,避免运行时 ClassCastException;同时省去大量强制转换,让代码更简洁可靠。不声明类型参数,就无法复用;不实例化时指定具体类型,就无法触发编译检查——二者缺一不可。

















