java中不能直接new t[n],因类型擦除导致jvm不知t具体类型;须用array.newinstance(string.class, 5)等具体class创建并强转为t[],确保clazz与t一致才安全。

Java 中不能直接写 new T[n] 创建泛型数组,因为泛型在运行时被擦除,JVM 无法知道 T 具体是什么类型。但可以通过反射配合具体 Class 对象安全创建,关键在于“传真实类型、做正确转换、不越界使用”。
必须传入具体的 Class 对象
Array.newInstance 需要一个运行时存在的类对象,比如 String.class 或 Integer.class,不能用 T.class(编译不通过)。
- ✅ 正确:
Array.newInstance(String.class, 5)→ 返回String[] - ❌ 错误:
Array.newInstance(T.class, 5)→T.class语法非法 - ⚠️ 注意:基本类型如
int.class可用于创建原生数组(int[]),但不属于泛型数组范畴;若需泛型语义,应使用包装类Integer.class
强制转型是必要且可控的
Array.newInstance 返回的是 Object,需转为 T[]。这会产生 unchecked 警告,但只要传入的 clazz 和实际使用类型一致,就是安全的。
- 示例方法:
@SuppressWarnings("unchecked")<br>public static <t> T[] createArray(Class<t> clazz, int length) {<br> return (T[]) Array.newInstance(clazz, length);<br>}</t></t> - 调用时明确指定:
String[] arr = createArray(String.class, 10); - 不推荐:
Object[] objArr = arr;后往里塞非 String 对象——会触发ArrayStoreException
避免用 Object[] 模拟泛型数组
有些写法看似简单,比如 (T[]) new Object[n],但它创建的是 Object[],运行时类型不是 String[] 等具体数组类型,后续转型或反射操作可能失败。
- ❌ 危险:
T[] arr = (T[]) new Object[5];→ 运行时arr.getClass()是class [Ljava.lang.Object; - ✅ 安全:
T[] arr = (T[]) Array.newInstance(String.class, 5);→ 运行时arr.getClass()是class [Ljava.lang.String;
多数场景下,优先用 ArrayList
除非有明确需求(如高性能索引访问、与 JNI/Netty/序列化框架对接),否则建议用 ArrayList<t></t> 替代泛型数组。
- ArrayList 内部用
Object[]存储,规避了泛型数组限制 - 自动扩容、API 丰富、类型安全由编译器保障
- 泛型擦除不影响其使用体验:声明
ArrayList<string></string>后,add/get 都自动检查和转换
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











