Java中Object[]不能直接强转为int[]或String[],因JVM中类型不兼容,强转会抛ClassCastException;安全转换需先校验isArray()和getComponentType(),再分Object[]或原生基本类型数组分别处理。

Java 中 Object 数组不能直接强转为 int[]、String[] 等具体类型数组,因为 Object[] 和基本类型数组(如 int[])在 JVM 中是完全不同的类型,内存结构和运行时表示均不兼容。强行写 (int[]) objArray 会立即抛出 ClassCastException。安全转型的关键在于:先确认真实类型,再按类型分路径处理。
区分两类场景:Object[] vs 基本类型数组
首先要明确你手上的 Object 引用到底是什么:
-
它本身就是 Object[]:比如 MyBatis 查询返回的行数据、
list.toArray()结果、JSON 解析器生成的数组 —— 这类必须逐元素转换,不可整体强转; -
它底层是真正的基本类型数组:比如 JDBC 驱动对 PostgreSQL
int4[]字段的原生支持,返回的是int[]实例,此时obj.getClass()返回int[].class—— 这种才允许直接强转。
校验真实类型:必须做的两步检查
无论目标是 int[]、boolean[] 还是 String[],都应先做运行时类型判断:
- 调用
obj.getClass().isArray()确认它真是数组; - 再调用
obj.getClass().getComponentType()获取元素类型,例如返回int.class或java.lang.String.class; - 对基本类型数组,
getComponentType().isPrimitive()为true;对引用类型数组(包括 Object[]),该值为false。
针对 Object[]:安全转成具体引用类型数组(如 String[])
若确认是 Object[],且你想得到 String[]、User[] 等引用类型数组,可用带泛型的 Arrays.copyOf:
立即学习“Java免费学习笔记(深入)”;
String[] strs = Arrays.copyOf((Object[]) obj, ((Object[]) obj).length, String[].class);- 这会创建新数组并逐元素检查类型,遇到非 String 元素会抛
ArrayStoreException,比手动循环更简洁安全; - 若允许 null 或需容错,可改用循环 +
instanceof判断后赋值。
针对 Object[]:转成基本类型数组(如 int[])需拆箱处理
Object[] 里存的通常是 Integer 对象,不能强转,必须显式拆箱:
- 推荐用 Stream:
int[] arr = Arrays.stream((Object[]) obj).mapToInt(o -> (Integer) o).toArray(); - 注意:若数组含
null,(Integer) o会 NPE,应先过滤或用Objects.nonNull判断; - 性能敏感场景可用传统 for 循环,避免 Stream 开销,但代码略长。


















