Java泛型类通过类名后加<T>声明类型参数,创建对象时指定具体类型(如String),编译期即检查类型安全;T代表非基本类型,可用于字段、参数和返回值;new时用Box<String>实例化,支持菱形运算符;不可用基本类型、静态成员不能用T、泛型数组需规避。

Java 中定义和使用泛型类,核心就两点:在类名后加
怎么定义一个泛型类
用单个大写字母(推荐 T、E、K、V)占位,代表将来传入的具体类型。这个字母在整个类内部都可以当真实类型用:
- 声明格式:class 类名<T> { ... }
- T 可以是任意非基本类型(不能是 int、char,但可以用 Integer、Character)
- 类中字段、方法参数、返回值都可以用 T,比如 private T data;、public void set(T value)、public T get()
- 常见命名习惯:T 表示 Type,E 表示 Element(集合常用),K/V 用于 Map
怎么使用泛型类
关键动作发生在 new 的时候——指定具体类型,之后所有 T 都被替换成它:
- 写法:Box<String> box = new Box<>();(JDK7+ 支持菱形运算符 <> 省略右侧)
- 此时 box 只能存 String,set(123) 编译失败;get() 返回 String,不用强转
- 可以多次复用同一个类:再写 Box<Integer> intBox = new Box<>();,就得到一个专存数字的版本
- 不写泛型(如 Box box = new Box();)会退化为“原始类型”,失去类型检查,不推荐
一个完整可运行的例子
下面是一个带构造器和 getter/setter 的泛型容器类,加上测试代码:
立即学习“Java免费学习笔记(深入)”;
- 泛型类定义:
public class Box<T> {
private T content;
public Box(T content) { this.content = content; }
public void setContent(T content) { this.content = content; }
public T getContent() { return content; }
} - 使用方式:
Box<String> sBox = new Box<>("hello");
String str = sBox.getContent(); // 直接得 String
Box<Double> dBox = new Box<>(3.14);
double d = dBox.getContent(); // 自动拆箱,无需 (Double)
新手容易踩的坑
避开这几个典型错误,能少走很多弯路:
- 基本类型不能直接用:写 Box<int> 会报错,必须用包装类 Box<Integer>
- 泛型不参与运行时类型识别:Box<String> 和 Box<Integer> 编译后都是 Box,所以 if (obj instanceof Box<String>) 是非法语法
- 静态成员不能用类的泛型参数:T 属于实例,static 方法/字段里不能出现 T,否则编译失败
- 数组不能直接用泛型类型创建:new Box<String>[10] 不合法,要用 Object[] 转换或改用 ArrayList


















