arrays.copyof仅浅拷贝且不自动类型转换,源数组元素类型必须兼容目标数组组件类型,否则运行时抛arraystoreexception;基本类型数组不可转引用类型数组;二维数组复制后内层数组仍共享引用;泛型擦除下应使用字面量class避免捕获异常。

Arrays.copyOf 本身不执行类型转换,只做浅拷贝。如果源数组和目标类型不兼容,运行时会抛出 ArrayStoreException,而不是编译错误——这是最易被忽视的陷阱。
目标类型与源数组元素类型必须兼容
Arrays.copyOf(U[] original, int newLength, Class extends T[]> newType) 要求 newType 的组件类型(如 String.class)能容纳 original 中每个元素的实际类型。否则,System.arraycopy 在复制过程中会检测到类型不匹配并报错。
- String[] arr = {"a", "b"};
Object[] copy = Arrays.copyOf(arr, 3, Object[].class); // ✅ 允许,String 是 Object 子类 - Integer[] nums = {1, 2};
String[] bad = Arrays.copyOf(nums, 2, String[].class); // ❌ 运行时报 ArrayStoreException - Object[] objs = {"x", 42};
String[] fail = Arrays.copyOf(objs, 2, String[].class); // ❌ 第二个元素是 Integer,存不进 String[]
基本类型数组无法直接转为引用类型数组
int[]、double[] 等基本类型数组不能用 copyOf 转成 Integer[]、Double[] 或 String[]。Java 不自动装箱,也不会调用 toString()。
- int[] a = {1, 2, 3};
String[] s = Arrays.copyOf(a, 3, String[].class); // 编译失败:类型不匹配 - 正确做法是手动遍历 + String.valueOf() 或 Stream.map(String::valueOf)
二维数组复制后仍是浅拷贝
对 int[][] 使用 copyOf,新数组的外层数组是独立对象,但内层数组(如 data[0]、data[1])仍与原数组共享引用。修改 dataCopy[0][0] 会影响 data[0][0]。
- int[][] data = {{1,2}, {3,4}};
int[][] copy = Arrays.copyOf(data, 2, int[][].class);
copy[0][0] = 99; // data[0][0] 同时变为 99 - 如需深拷贝二维数组,需逐行 copyOf 或用嵌套循环 + clone()
泛型擦除导致的 Class 对象误判
编译期泛型信息被擦除,传入 newType 时若用变量而非字面量(如 Class.forName("java.lang.String[]")),可能因类型捕获问题导致 Class 比较失败,影响内部 newType 判定逻辑,间接引发异常或意外行为。
- 推荐写法:Arrays.copyOf(strs, len, String[].class) —— 字面量安全
- 避免:Class> t = String[].class; Arrays.copyOf(strs, len, (Class
)t) —— 易触发捕获异常











