Java泛型类通过类型参数(如T)实现通用容器,编译期保证类型安全,运行时类型擦除;定义时用尖括号声明形参,支持多参数及上界约束;使用时避免原始类型,标准集合类已泛型化,通配符用于灵活类型匹配。

Java 中使用泛型类实现通用数据结构容器,核心是用类型参数(如 T)替代具体类型,让类能适配任意数据类型,同时保留在编译期的类型安全检查。
定义泛型类的基本写法
在类名后添加类型参数声明,用尖括号包裹,比如 class MyList<t></t>。这里的 T 是类型形参,代表使用者将来传入的具体类型(如 String、Integer 等)。它不是实际类型,而是占位符,编译后会被擦除(类型擦除),但编译器会据此做类型校验。
- 多个类型参数可用逗号分隔,例如
class Pair<k v></k> - 可加约束,如
class Box<t extends number></t>,表示T必须是Number或其子类 - 避免使用原始类型(如直接写
ArrayList),始终用带类型参数的形式(如ArrayList<string></string>)以启用泛型检查
用泛型实现一个简易动态数组容器
以封装 Object[] 为基础,对外暴露类型安全的增删查接口:
public class SimpleList<T> {
private Object[] data;
private int size;
<pre class="brush:php;toolbar:false;">public SimpleList() {
this.data = new Object[10];
this.size = 0;
}
public void add(T item) {
if (size >= data.length) {
data = Arrays.copyOf(data, data.length * 2);
}
data[size++] = item;
}
@SuppressWarnings("unchecked")
public T get(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException();
}
return (T) data[index]; // 类型擦除后需强制转换,但由泛型保证安全
}
public int size() {
return size;
}}
立即学习“Java免费学习笔记(深入)”;
使用时:SimpleList<string> list = new SimpleList(); list.add("hello"); String s = list.get(0);</string> —— 不需要手动转型,编译器已确认返回值是 String。
泛型与集合类的协作要点
Java 标准库的 ArrayList、HashMap 等本身就是泛型类,直接使用即可。关键是要理解它们如何帮你规避运行时类型错误:
- 向
ArrayList<integer></integer>添加字符串会编译失败,而不是等到运行时报ClassCastException - 从
Map<string list>></string>取值时,get("key")的返回类型自动推导为List<person></person>,无需强转 - 注意通配符的适用场景:比如方法参数用
Collection extends Number>表示可接受Integer、Double等集合,但不能往里加元素(除了null)
常见陷阱与应对
泛型不能用于静态字段或方法的类型参数,因为类型信息在运行时不存在;也不能创建泛型数组(如 new T[10]),需改用 Object[] + 转换;反射获取泛型实际类型也受限于类型擦除。
- 替代泛型数组:用
ArrayList<t></t>或Object[]+ 显式转型(配合@SuppressWarnings("unchecked")) - 静态方法需单独声明类型参数,如
public static <e> void printArray(E[] arr)</e> - 避免原始类型交互:不要把
ArrayList(无泛型)和ArrayList<string></string>混用,否则失去类型保护
不复杂但容易忽略:泛型本质是编译期机制,它的价值在于提前暴露类型问题,而不是改变运行时行为。写容器时,把类型参数当作“契约”来设计接口,使用者自然获得安全与清晰。


















