java泛型不支持基本类型和直接创建泛型数组,需用object[]+泛型方法+运行时检查模拟;必须用包装类替代基本类型,推荐arraylist替代数组,或通过反射/class创建带类型信息的数组。

Java泛型本身不支持基本类型(如 int、double),也不能直接创建泛型数组(如 new ArrayList<int>[10]</int>),这是由类型擦除和JVM运行时机制决定的。但你可以通过“泛型数组包装器”这一模式,在保持类型安全的同时,绕过这些语法限制——核心不是真的造出泛型数组,而是用 Object 数组 + 泛型边界 + 运行时检查 模拟行为。
用 Object 数组封装,靠泛型方法约束存取
泛型类内部不声明 T[],而声明 Object[],再通过泛型方法控制读写入口,让编译器在调用处强制类型匹配:
- 声明一个私有
Object[]数组作为底层存储 - 所有
add(T item)方法只接受T类型参数,自动完成类型校验 -
get(int i)方法返回T,编译器知道结果无需强制转换 - 避免暴露
Object[]给外部,防止绕过类型检查
必须用包装类替代基本类型
泛型参数只能是引用类型,所以 int 要换成 Integer,boolean 换成 Boolean 等。这不是妥协,而是设计必然:
- 例如定义
ArrayWrapper<integer></integer>,内部存的是Object[],但每次add(42)触发自动装箱,get(0)返回Integer,使用者无需(Integer)强转 - 虽然存在装箱开销,但换来的是编译期类型安全——比如往
ArrayWrapper<string></string>里塞123,编译直接报错,不会等到运行时报ClassCastException
规避泛型数组创建失败的常见写法
Java禁止 new T[10] 或 new ArrayList<string>[5]</string>,但你可以这样安全替代:
- 用
ArrayList<t></t>代替数组:它内部就是Object[],但封装了全部泛型逻辑,最推荐 - 若真需数组语义(如固定长度、随机访问快),可声明
T[] array字段,但初始化时用反射或类型令牌:array = (T[]) new Object[capacity](需加@SuppressWarnings("unchecked"),并确保后续只存T) - 更稳妥的做法是传入
Class<t></t>,借助Array.newInstance(clazz, size)创建带运行时类型的数组(适用于需要真实类型信息的场景,如序列化)
配合通配符提升灵活性
当包装器要对接不同子类型时,用上界通配符避免重复转换:
- 比如方法接收
ArrayWrapper extends Number>,就能同时处理ArrayWrapper<integer></integer>和ArrayWrapper<double></double> - 此时读取元素可安全赋给
Number变量,但不能往里 add 任意Number(因不确定具体子类型),符合 PECS 原则 - 这种设计让包装器既保持类型安全,又不失通用性,比裸用
Object[]加满屏(String)强转清晰得多
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











