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>} - 调用时明确指定:
String[] arr = createArray(String.class, 10); - 不推荐:
Object[] objArr = arr;后往里塞非 String 对象——会触发ArrayStoreException
避免用 Object[] 模拟泛型数组
有些写法看似简单,比如 (T[]) new Object[n],但它创建的是 Object[],运行时类型不是 String[] 等具体数组类型,后续转型或反射操作可能失败。
立即学习“Java免费学习笔记(深入)”;
- ❌ 危险:
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> 替代泛型数组。
- ArrayList 内部用
Object[]存储,规避了泛型数组限制 - 自动扩容、API 丰富、类型安全由编译器保障
- 泛型擦除不影响其使用体验:声明
ArrayList<String>后,add/get 都自动检查和转换


















