java类型转换核心规则是“小范围值进大容器”才自动,否则需强制;自动转换看数值表达能力而非字节大小,如long→float合法;byte/char等无继承关系的类型不可互转;强制转换仅编译放行,不保结果正确;string与基本类型无任何转换路径,须用工具方法;引用类型转换依赖继承关系,无关类型强转运行时报错。

Java 类型转换的兼容性规则,核心就一条:能自动转的,一定是“小范围值进大容器”,其余都得强制——而且强制不等于安全,只是编译器放行。
自动转换只认范围,不看字节大小
自动转换不是按“占几个字节”来算的,而是比谁的数值表达能力更强。比如 long → float 是合法自动转换,虽然 long 占 8 字节、float 只占 4 字节,但 float 能表示 1e38 这样的极大数,long 最大才约 9e18,所以 float “范围更大”。类似地:
- char → int 自动('A' 变成 65)
- byte/short → int 自动(哪怕 byte 是 1 字节,int 是 4 字节)
- int → double 自动(整数可无损表示为 double)
- float → double 自动(精度提升,无信息丢失)
注意:byte 和 char 之间不能自动互转,哪怕都是 2 字节;short 和 char 也不行——它们没有继承关系,且语义不同(字符 vs 数值),必须强制,且易出错。
强制转换必须显式写括号,但不保结果正确
只要目标类型容纳不下源值,Java 就要求你亲手加 (TargetType)。这不是给你开绿灯,是让你签字担责:
-
double → int:直接砍掉小数,
(int) 3.99得 3,不是四舍五入 -
int → byte:只取低 8 位补码,
int x = 300; byte b = (byte) x;结果是 44(300 % 256) - long → int:超出 int 范围(±2147483647)时,高位被丢弃,结果不可预测
-
boolean 和 String 都不能参与任何基本类型转换,写
(int) true或(String) 123直接编译失败
字符串和数字互转,根本不在基本类型转换体系里
String 是引用类型,和 int/double 等八种基本类型之间没有自动或强制转换路径。所谓“转换”,全是工具方法调用:
-
数字 → 字符串:用
String.valueOf(123)(推荐,空安全)或"" + 123(本质拼接,非转换) -
字符串 → 数字:用
Integer.parseInt("123")(返回 int)或Double.parseDouble("3.14")(返回 double) -
别踩坑:
new Integer("123")已废弃;(int)"123"编译不通过;空字符串或含字母的字符串会抛NumberFormatException
引用类型转换另有一套逻辑,和数值转换无关
对象之间的转换看继承链,不是看“大小”:
-
向上转型(父类引用指向子类):自动,安全,如
Object obj = new ArrayList(); -
向下转型(子类引用接父类变量):必须强制,且运行时检查,
ArrayList list = (ArrayList) obj;前建议先if (obj instanceof ArrayList) -
无关类型强转:比如
HashSet强转ArrayList,编译能过,运行必报ClassCastException
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











