Java泛型不支持基本类型,只能使用包装类;编译期类型擦除导致运行时无泛型信息,依赖自动装箱/拆箱实现基本类型值的隐式转换,但存在性能开销与空指针风险。

Java 泛型在编译期被擦除,**不会为基本类型生成独立的泛型类型**,所以你不能直接写 List<int></int> —— 这在语法上就不合法。真正起作用的是“自动装箱/拆箱”与“类型擦除”的配合,而不是泛型本身支持基本类型。
泛型不支持基本类型,只能用包装类
Java 泛型只接受引用类型(即类),int、boolean、char 等基本类型不能作为类型参数。你必须使用对应的包装类:Integer、Boolean、Character 等。
-
List<integer></integer>✅ 合法,底层实际是List(擦除后) -
List<int></int>❌ 编译错误,根本通不过
擦除后统一变成原始类型,运行时无类型信息
像 List<integer></integer>、List<string></string>、List<double></double> 在编译后都变成裸类型 List,JVM 不知道它曾“装过”什么类型。这意味着:
- 无法通过反射获取泛型的实际类型参数(如
list.getClass().getTypeParameters()拿不到Integer) - 不能在运行时做
if (list instanceof List<integer>)</integer>—— 因为擦除后只有List - 所有元素在运行时都当作
Object存储,取出来时靠编译器插入强制转型(如(Integer) list.get(0))
基本类型参与泛型时,靠自动装箱/拆箱“隐身转换”
虽然泛型不认 int,但 Java 允许你在使用包装类泛型时,自然地混用基本类型值,靠编译器自动处理:
立即学习“Java免费学习笔记(深入)”;
- 添加时:
list.add(123)→ 自动装箱为new Integer(123) - 读取时:
int x = list.get(0)→ 先转型为Integer,再自动拆箱为int - 注意:如果
list.get(0)返回null,拆箱会触发NullPointerException
性能与空值风险需手动管理
装箱/拆箱不是免费的,尤其在循环或大数据量场景下:
- 频繁装箱会创建大量短生命周期对象,增加 GC 压力
- 集合中可能存
null,拆箱前未判空会导致崩溃 - 若需高性能或确定不含
null,可考虑第三方库(如 Eclipse Collections、Trove)提供的原生基本类型集合(如IntList),它们绕过泛型,内部直接用int[]


















