Object不是数据容器而是顶层父类;强转还原基本类型数组需先通过getClass().isArray()和getComponentType()校验真实类型,再安全转换:int[]可直接强转,Object[]需遍历逐元素转换。

Object 本身不是数据容器,而是所有类的顶层父类。所谓“强转还原为基本类型数组”,本质是确认底层真实类型后,安全提取或转换其元素——不能靠 (int[]) 这类强制转换直接“修复”类型,而需结合类型检查、反射或泛型辅助完成。尤其在轻量级 ORM 中,从 ResultSet 或 Map 提取结果时,常遇到 Object 形式的列值或行数据,需高效、无损地映射为 int[]、String[] 等原生数组。
先判明真实类型,再决定是否可安全强转
Java 中 Object obj = new int[]{1,2,3} 的真实运行时类型是 int[],此时 (int[]) obj 成立;但若 obj = Arrays.asList(1,2,3).toArray(),实际是 Object[],强转 int[] 必抛 ClassCastException。因此必须前置校验:
- 用
obj.getClass().isArray()判断是否为数组类型 - 用
obj.getClass().getComponentType()获取元素类型,例如返回int.class或java.lang.String.class - 对基本类型数组(
int[]、boolean[]等),getComponentType().isPrimitive()为true;对引用类型数组则为false
针对基本类型数组:直接强转 + 零拷贝提取
若确认 obj 是 int[]、double[] 等原生数组,无需复制,直接强转即可获得高性能访问:
-
int[] arr = (int[]) obj;—— 安全、零开销,适用于 JDBC 驱动直接返回的int[](如 PostgreSQL 的int4[]字段) - 若字段是
Object但内部封装了Integer[],不可强转为int[];需先转引用数组,再用Arrays.stream(...).mapToInt(...)装箱拆箱,有性能损耗 - ORM 映射层可在字段元信息中标注“原始数组类型”,避免每次运行时重复判断
针对 Object[] 数组:按需逐元素转换,避免隐式装箱陷阱
多数 ORM(包括 MyBatis 默认)和 JSON 解析器(如 FastJSON)返回的是 Object[],而非基本类型数组。此时不能整体强转,但可批量、可控地转换:
- 不推荐
Arrays.toString((String[]) obj)这类写法——若obj实为Object[]含Integer元素,强转会失败 - 推荐模式:
Object[] src = (Object[]) obj;→ 遍历 +instanceof分支 → 调用Number.intValue()、String.valueOf()等明确转换逻辑 - 对整数列统一转
int[]示例:
if (src == null) return new int[0];
int[] dst = new int[src.length];
for (int i = 0; i if (src[i] instanceof Number) {
dst[i] = ((Number) src[i]).intValue();
} else if (src[i] instanceof String) {
dst[i] = Integer.parseInt((String) src[i]);
} else {
throw new IllegalArgumentException("无法转换为int: " + src[i]);
}
}
return dst;
}
反射辅助泛型化提取,提升 ORM 映射复用性
在自研 ORM 的 ResultSetHandler 或 RowMapper 中,可封装一个泛型工具方法,根据目标数组类型自动选择策略:
- 接收
Class<t> arrayType</t>(如int[].class)与Object rawValue - 若
arrayType.getComponentType().isPrimitive(),走直接强转分支 - 否则按引用类型数组处理,调用对应包装类的
valueOf或构造器 - 配合
@SuppressWarnings("unchecked")控制编译警告,但确保运行时类型校验完整

















