Java隐式转换仅支持小范围→大范围无精度丢失,如byte→int、char→int;反向及boolean/字符串等必须显式强制转换,且(int)不校验运行时安全。

Java里哪些基本类型能自动转,哪些必须写(int)这种括号
Java的隐式转换只发生在「小范围→大范围」且无精度丢失风险的场景。比如byte→short→int→long→float→double这条链上,相邻向右可以自动转;反过来一律报错。
常见错误现象:int i = 10; byte b = i; 编译失败,提示incompatible types: possible lossy conversion from int to byte——不是值太大,而是编译器不信任你没丢数据。
-
char到int是隐式的(char本质是无符号16位整数),但int→char必须显式强制转换 -
boolean跟任何其他类型都不能互转,连(boolean)1都不合法 -
float→double隐式,但double→float必须显式,哪怕数值看起来“很安全”
什么时候(int)会悄悄丢数据,连编译都不拦着
显式强制转换(cast)只绕过编译检查,不保证运行时安全。它直接截断高位或舍入,而不会抛异常。
使用场景:读取网络字节流、处理像素值、解析二进制协议时,常需把int压成byte,或把double截成int取整。
立即学习“Java免费学习笔记(深入)”;
-
int x = (int)3.9;→ 结果是3(向零截断,不是四舍五入) -
byte b = (byte)257;→ 实际存的是1(257 % 256,只留低8位) -
short s = (short)-32769;→ 得到32767(溢出回绕,补码运算结果)
Integer.parseInt()和(int)根本不是一回事
这是新手最常混淆的点:(int)是基本类型间转换,Integer.parseInt()是把字符串转成int值,背后涉及字符解析、进制判断、异常处理。
性能影响:字符串解析比类型转换慢两个数量级以上;兼容性上,parseInt("123")支持带符号和指定进制(如parseInt("FF", 16)),而(int)对字符串完全无效。
- 想把
"123"变成数字?用Integer.parseInt("123"),别试(int)"123"(编译不过) - 想把
double d = 123.45;取整?(int)d得123,Math.round(d)得123L(注意返回long) -
parseInt()遇到空格或非数字字符直接抛NumberFormatException,没容错机制
包装类自动拆箱时的隐式转换陷阱
当你写Integer i = 100; int j = i + 1;,表面看是“自动拆箱”,实际分两步:先拆成int,再做加法。但若对象为null,就会在拆箱时触发NullPointerException。
更隐蔽的是缓存问题:Integer a = 127; Integer b = 127;,a == b为true;但Integer a = 128; Integer b = 128;,a == b为false——比较的是引用,不是值。一旦混用==和.equals(),逻辑就容易崩。
- 永远用
.equals()比较包装类值,除非你明确想比引用 - 拆箱前检查
null,尤其从集合或JSON反序列化来的值 - 不要依赖
Integer.valueOf(x)的缓存范围(-128~127),它只是JVM规范建议,不是强制
类型转换看着简单,真正麻烦的是边界行为和隐含假设——比如认为(int)1.999999999一定得1,却忽略了浮点数表示误差可能让它变成2.0;又比如把Long强转int前,忘了它可能超出int范围。










