Java强制类型转换仅按位截断或重解释,不校验合法性也不抛异常;整数转小类型静默取低N位补码,浮点转整数向零截断,boolean/String不可直转,需用parse方法;溢出须手动边界判断或用Math.exact系列;引用类型强转前必用instanceof守门;推荐优先使用安全工具方法替代裸强转。

Java 中强制类型转换不是加个括号就完事,它不检查数值是否合法,也不抛异常,只按位截断或重新解释——结果对不对,全靠你提前把关。
基本类型强制转换的写法和常见错误
语法统一为:(目标类型) 表达式。比如 (int) 3.14 得到 3,(byte) 200 得到 -56。
- 整数转小类型:
int → byte、long → int等,超出范围时静默取低 N 位补码,不会报错 - 浮点转整数:一律向零截断(不是四舍五入),
(int) 9.99是 9,(int) -9.99是 -9 - boolean、String 不能直接强转成数字类型,
(int)"123"编译失败,必须用Integer.parseInt("123") - char 是无符号 16 位,但和其他整型混用时容易误当有符号处理,比如
(byte)'\u00FF'实际是 -1
溢出风险怎么识别和拦截
关键不是“能不能转”,而是“转完值对不对”。溢出常发生在大范围→小范围转换中,且毫无提示。
- 手动边界判断:转换前检查是否在目标类型范围内,例如
if (i Byte.MAX_VALUE) - 用带溢出检查的工具方法:
Math.toIntExact(long)、Math.addExact(a, b),越界直接抛ArithmeticException - 浮点转整数要分两步:先
Double.isFinite(d)排除 NaN 和无穷,再校验是否落在Integer.MIN_VALUE到Integer.MAX_VALUE之间 - 外部数据(如数据库 ID、时间戳、JSON 数字)默认可能是
Long,别盲目(int) obj,先适配语义再校验
引用类型强转的运行时陷阱
编译期看不出问题,运行时一碰就崩。
立即学习“Java免费学习笔记(深入)”;
-
(String) obj如果obj实际是Double或null,执行时抛ClassCastException - 务必先用
obj instanceof String守门;Java 14+ 可写成if (obj instanceof String s),一步完成判断和赋值 - 泛型集合如
List<Object>取出的元素,Jackson/Protobuf 默认解析为Double或Long,不能假设是Integer -
instanceof对null返回false,本身空安全,但若业务逻辑允许 null,建议单独处理避免异常混杂
更安全的替代方案推荐
能不用强转,就尽量绕开;必须用,就让行为可预期、可拦截。
- 字符串转数字:用
Integer.valueOf(str)或Long.parseLong(str),非法格式直接抛NumberFormatException - 毫秒时间戳转 int:2038 年后必然溢出,应先除以 1000 得秒级,再判断是否在 int 范围内
- 网络/硬件来的无符号字节(如
0xFF):别直接(byte)b,改用b & 0xFF转成int表示 255 - 封装通用工具类,比如
SafeCasts.toInt(long v)内部调用Math.toIntExact,统一处理逻辑


















