在 Java 开发当中把 object 转 integer 核心做法就是先判断 object 实际运行类型是不是 Integer,如果是就直接强转,如果不是就优先使用 Integer 的 parseInt 或者 valueOf 方法完成转换,同时必须提前做空值判断和类型兼容处理,避免出现空指针异常或者类型转换异常。object 是所有类的父类型,它本身只是一个引用,里面保存的对象实例才是真正的数据,很多初学者容易误以为 object 可以直接强制转换成 integer,但是如果 object 里面装的是字符串类型的数字,直接强转就会抛出 ClassCastException,这也是这个转换最常见的坑。因为向上转型之后,编译期只知道它是 Object,但是运行时虚拟机还是会校验真实对象类型,真实类型不匹配就转换失败,所以转换前的类型校验是必不可少的环节。
转换核心原理
Object 属于顶层父类引用,多态机制允许它指向任意引用类型对象,Integer 是包装类,属于引用类型,不是基本数据类型 int。
强转的本质是引用类型的向下转型,只有原本对象创建的时候就是 Integer 实例,向下强转才合法。
如果 Object 内部存的是 String BigDecimal Long Number 其他子类,不能直接强转为 Integer,需要把里面的数值解析之后再生成 Integer 对象。
两种主流转换方案
方案一 原生强转 适用场景 Object 原本就是 Integer 对象
代码逻辑
判断 object 是否不等于 null
判断 object instanceof Integer
执行 (Integer) object 完成 object 转 integer
优点 性能最高,没有额外解析开销
缺点 限制很大,只支持原生 Integer 实例,字符串数字会报错
方案二 解析转换 适用场景 Object 里面是字符串数字或者其他 Number 类型
代码逻辑
判断 object 不为空
如果是 Number 类型,调用 intValue () 拿到 int 值,再装箱成 Integer
如果是 String 类型,使用 Integer.parseInt 把字符串解析成 int,再装箱成 Integer
优点 兼容性强,可以处理字符串数字 Long BigDecimal 等常见类型
缺点 会增加少量运算开销,非法数字字符串会抛出 NumberFormatException
异常场景说明
空指针异常 object 本身是 null,直接强转或者 parseInt 就会触发
类型转换异常 object 真实类型和目标类型不匹配,比如 Object 存了 Boolean 直接强转 Integer
数字格式异常 Object 里面是文字内容,不是合法数字,parseInt 解析失败
完整推荐工具写法
public static Integer objectToInteger (Object obj)
if (obj == null) return null
if (obj instanceof Integer) return (Integer) obj
if (obj instanceof Number) return ((Number) obj).intValue ()
if (obj instanceof String) return Integer.parseInt ((String) obj)
throw new IllegalArgumentException ("当前 object 无法转 integer")
转换注意事项
数值溢出问题 如果原始数值超过 Integer 的取值范围也就是负 2147483648 到正 2147483647,intValue 截断之后数据会失真,转换前最好做范围校验
自动装箱拆箱 转换完成之后 Integer 和 int 可以自动互转,但是注意 Integer 缓存区间是负 128 到 127,比较的时候不要误用 ==,要用 equals
空值处理 业务里如果允许空值,方法要返回 null,不要强行转成 0,避免业务数据出错
【常见问题】
问题 1 object 转 integer 的时候为什么直接强转会报错
回答 1 object 转 integer 直接强转报错,根本原因是 object 内部真实对象类型不是 Integer,虚拟机运行时校验类型不匹配,抛出 ClassCastException,这种情况不能继续强转,要改用 Number 或者字符串解析的方式完成 object 转 integer。
问题 2 object 转 integer 遇到 null 应该怎么处理
回答 2 object 转 integer 遇到 null 的时候,推荐在转换代码最前面增加非空判断,如果业务允许空值就直接返回 null,如果业务不允许空值就抛出参数异常,不要对 null 执行强转,否则 object 转 integer 会触发空指针异常。
问题 3 object 转 integer 可以处理 Long 类型的数据吗
回答 3 object 转 integer 可以处理 Long 类型的数据,Long 属于 Number 子类,可以调用 intValue 方法提取数值完成 object 转 integer,但是要注意数值如果超过 Integer 最大值,object 转 integer 之后会出现数值截断失真。
问题 4 object 转 integer 和 object 转 int 有什么区别
回答 4 object 转 integer 得到的是包装类 Integer 对象,可以为 null,object 转 int 得到基本数据类型 int,不能为 null,object 转 integer 之后还可以自动拆箱变成 int,但是拆箱的时候如果 Integer 是 null 依然会出现空指针。
【免责申明】
本文内容仅作为 Java 技术学习参考,代码示例需要结合自身项目业务场景调整,不同 JDK 版本以及框架封装类可能存在差异,生产环境使用前请充分测试,因直接复制代码造成的数据异常业务报错等问题,由使用者自行承担相关风险。


