java泛型不支持基本类型,因类型擦除要求泛型参数必须是引用类型;基本类型如int非对象,无法擦除为object,故需使用integer等包装类替代。

因为Java泛型基于类型擦除实现,而基本类型不是对象,无法被擦除为Object或其子类——这是根本原因。
类型擦除要求所有泛型参数最终变成引用类型
编译时,泛型信息会被擦除,比如List<string></string>变成List(原始类型),其内部元素统一按Object处理;若声明List<int></int>,擦除后无法对应到任何合法的引用类型,JVM不支持将int当作对象存入集合或参与多态调度。
基本类型和包装类在内存与语义上本质不同
– int 是栈上直接存储的值,无身份、无方法、不继承Object
– Integer 是堆上对象,有哈希码、可为空、能调用toString()等,完全兼容引用类型体系
自动装箱(如list.add(42))只是语法糖,底层仍操作Integer对象,而非绕过类型系统直接塞进int
其他限制也源于同一机制
– 不能new E():擦除后E变成Object,但实际需要的是具体子类实例
– 不能static T field:静态变量属类级别,而T只在实例化时确定,编译期无法绑定
– 不能instanceof ArrayList<integer></integer>:运行时泛型已消失,只剩ArrayList
– 不能List<integer>[] arr = new List<integer>[5]</integer></integer>:数组需在运行时知道组件类型,但擦除后无法保障类型安全
替代方案很自然
– 用Integer、Boolean、Double等代替int、boolean、double
– 利用自动装箱/拆箱简化写法(如map.put("age", 25)自动转为Integer)
– 性能敏感场景可考虑IntArrayList(来自Trove或Eclipse Collections)等专为基本类型优化的第三方集合










