system.arraycopy要求目标数组元素类型必须是源数组元素类型的父类或相同类型,支持同类型及子类→父类复制,不支持基本类型互转或引用与基本类型互转,运行时检查类型兼容性。

System.arraycopy 要求源数组和目标数组的**组件类型必须兼容**,不是严格“同类型”,而是满足赋值兼容性(即能通过编译时类型检查),核心是:目标数组的元素类型必须是源数组元素类型的**父类或相同类型**。
支持的类型组合
以下情况可以正常执行(不抛 ArrayStoreException):
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 同类型数组之间复制:如
int[] → int[]、String[] → String[] - 子类数组 → 父类数组:如
String[] → Object[]、ArrayList[] → List[] - 基本类型数组之间不兼容:如
int[]不能复制到long[]或Integer[],会编译失败(参数类型不匹配) - 引用类型与基本类型互转不支持:如
Integer[]无法复制到int[](自动拆箱不在此生效)
编译期检查 vs 运行时检查
方法签名是:public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
- 编译时只校验传入的
src和dest是否为数组对象(即Object类型),不检查元素类型 - 实际类型兼容性在运行时检查:若
dest元素类型无法存放src的元素(如把String往Number[]里复制),则抛 ArrayStoreException
常见错误示例
-
String[] strs = {"a"}; Number[] nums = new Number[1]; System.arraycopy(strs, 0, nums, 0, 1);→ 运行时报 ArrayStoreException(String 不是 Number 子类) -
int[] a = {1}; Integer[] b = new Integer[1]; System.arraycopy(a, 0, b, 0, 1);→ 编译失败(类型不匹配,参数期望 Object,但 int[] 不能自动转为 Object) -
Object[] objArr = new Object[1]; objArr[0] = "hello"; String[] strArr = new String[1]; System.arraycopy(objArr, 0, strArr, 0, 1);→ 成功(因为 objArr[0] 实际是 String,可存入 String[])
安全使用的建议
- 优先在相同类型数组间使用,最稳妥
- 跨类型复制前,确认目标数组类型是源元素类型的可赋值类型(可用
instanceof预判,但 arraycopy 本身不负责逐个检查) - 避免用 Object[] 接收子类数组后往非兼容目标数组复制,容易触发运行时异常
- 基本类型数组操作不要尝试绕过类型系统——需手动遍历转换或改用
Arrays.copyOf等封装方法
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










