java无法直接创建泛型数组,应使用object[]作底层容器,通过入口set校验和出口单元素转型保障类型安全;必要时用class反射创建真实泛型数组;优先选用list替代。

Java 中无法直接创建泛型数组,这是由类型擦除机制决定的硬性限制。安全做法不是强行绕过限制,而是把类型控制落在写入和读取环节——用 Object[] 当底层容器,入口校验、出口转型,既保持编译期安全,又避免运行时异常。
用 Object[] 作底层数组 + 类型强校验入口
在泛型类中,不要声明 T[] array,而应声明 private final Object[] array:
- 构造时只做
this.array = new Object[size],不涉及任何泛型强制转换,无警告 - 提供
set(int index, T item)方法:参数是T,编译器自动保证传入值类型合法,内部直接存入array[index] = item - 禁止暴露
(T[]) array这样的转换,否则调用方可能误用导致ClassCastException
读取时单元素转型,而非整数组转型
get(int index) 返回 (T) array[index] 是安全的:
- 因为写入时已由
set方法确保只有T类型对象能进入数组 - 单个元素转型在运行时总能成功,不会抛异常
- 若需返回整个数组(如快照),用
Arrays.copyOf(array, size, T[]::new),它会生成正确类型的副本
必须返回真实泛型数组?用 Class 反射创建
当接口契约要求返回 T[](例如实现 Collection.toArray(T[]))时,需在构造时传入类型令牌:
- 构造函数接收
Class<t> componentType</t>,如new GenericArray(5, String.class) - 初始化写为
this.array = (T[]) Array.newInstance(componentType, size) - 这样生成的数组运行时就是
String[]等具体类型,支持instanceof判断,可安全转型
优先用泛型集合替代数组
除非有明确需求(如 JNI、固定长度语义、性能敏感场景),否则推荐用 List<t></t>:
-
private final List<t> list = new ArrayList();</t>—— 无类型擦除隐患,API 更丰富 - 需要数组时调用
list.toArray(new T[0]),JVM 自动推导类型并返回安全副本 - 集合天然支持通配符协变(
? extends T)和逆变(? super T),灵活性远超数组
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











