高精度转低精度需预防溢出而非依赖强制转换;应先值域检查或提升运算精度,再转换,且注意浮点截断、字符范围、整型乘法溢出、精度丢失及类型语义限制。

高精度转低精度时,强制转换本身不解决溢出,只做截断;真正要避开溢出,得在转换前控制值域或提升运算精度。
先判断是否越界,再决定是否转换
直接强转 byte b = (byte)128 不报错,但结果是 -128——这不是错误,而是按补码截断的必然行为。所以关键不是“怎么转”,而是“该不该转”。
- 对整型,可用目标类型的最大/最小值做预检:比如转 byte 前检查 value >= Byte.MIN_VALUE && value
- 对浮点转整型,需额外处理小数部分:(int)23.9 → 23,但若业务要求四舍五入,应改用 Math.round() 而非强转
- 字符转 int 是安全的(char 自动升为 int),但反过来 int 转 char 必须强转,且仅当值在 0–65535 范围内才有意义
运算阶段就防溢出,别等赋值才处理
常见陷阱:int money = 10_0000_0000; int years = 30; long total = money * years; ——看似 long 接收,实则乘法已在 int 范围内溢出,再赋给 long 也晚了。
- 把至少一个操作数提前升为高精度类型:money * (long) years 或 (long) money * years
- 用下划线提升可读性的同时,也提醒自己注意量级:int money = 1_000_000_000;
- 涉及累计、连乘等场景,优先声明为 long,避免中间步骤隐式溢出
精度丢失不可逆,转换前明确业务容忍度
double d = 123.999; int i = (int) d; 结果是 123,.999 永远丢弃。这不是 bug,是语义设计。
- 若需保留小数逻辑(如金额计算),不用 float/double + 强转,改用 BigDecimal 或整数单位(如“分”代替“元”)
- 若只是取整显示,确认是截断((int)x)、向下取整((int)Math.floor(x))还是四舍五入(Math.round(x))
- char 和 int 互转常用于 ASCII 码操作,但注意 char 是无符号 16 位,而 int 是有符号 32 位,强转不会溢出,但语义可能混淆
特殊类型间转换要守规则
Java 不允许某些转换,不是语法限制,而是语义冲突。
- boolean 不能强转成任何数字类型,也不能被数字强转——if 条件里必须是布尔表达式,不能写 if ((int)flag == 1)
- 对象引用类型之间不能随意强转,比如 String 转 Integer 必须用 Integer.parseInt(),而不是 (Integer)"123"
- 数组、泛型类型擦除后无法靠强转恢复原始类型,运行时会抛 ClassCastException










