Java泛型不允许List<int>,根本原因是类型擦除要求泛型参数必须是引用类型,而int是JVM基本类型,不继承Object、无运行时类对象,无法擦除为Object;编译器在语法分析阶段即报“Type argument cannot be of primitive type”错误。

Java 泛型不允许写 List<int>,不是语法偷懒,而是 JVM 类型系统和泛型实现机制之间存在硬性不兼容。
根本原因:类型擦除要求所有泛型参数必须是引用类型
泛型在编译后会被“擦除”为上界类型(默认是 Object)。比如 List<String> 擦除成 List,List<Integer> 也擦除成 List——因为 String 和 Integer 都是 Object 的子类。但 int 不是对象,不继承 Object,也没有运行时类实例(虽然有 int.class,但它不是引用类型),无法被擦除为 Object。编译器在语法分析阶段就直接拒绝,报错:Type argument cannot be of primitive type。
底层存储模型冲突:Object[] vs int[]
泛型集合如 ArrayList 内部用的是 Object[] 数组,靠类型转换访问元素。而 int[] 是 JVM 原生数组,内存布局、指令集(如 iaload/iastore)和 GC 行为都完全不同。即使强行绕过语法检查,JVM 也无法把 int 安全存进 Object[],也不能从 Object[] 里直接取出一个原始 int 值。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
自动装箱不能解决泛型约束
虽然 list.add(42) 看似能把 int 塞进 List<Integer>,那只是值传递时的自动装箱(int → Integer),不改变泛型类型系统的规则。你仍然不能声明 List<int>,也不能写 new int[10] 来替代 new Integer[10] 做泛型数组——前者是原生数组,后者是对象数组,语义和性能都不同。
立即学习“Java免费学习笔记(深入)”;
实用替代方案
- 用包装类:写
List<Integer>,接受装箱开销,适合逻辑清晰、数据量不大的场景 - 用专用原生集合库:如 FastUtil 的
IntList、Eclipse Collections 的MutableIntList,内部直接操作int[],零装箱、低 GC - 重载方法:对关键路径单独提供
void process(int[] data)版本,和泛型版<T> void process(T[] data)并存 - 避免误用
Arrays.asList(new int[]{1,2,3}):它返回的是List<int[]>(含一个数组元素),不是List<Integer>

















