Java自动类型转换只允许值域严格包含的方向:整数链byte→short→int→long→float→double,字符链char→int;运算中byte/short/char先升为int;引用类型仅支持向上转型;boolean、字符串、不兼容引用类型间禁止转换。

Java 中自动类型转换的安全方向,核心看“值域是否严格包含”——只允许从表示范围更小的类型,单向转到能完整容纳它的更大类型。这不是凭字节数判断,而是编译器静态验证:目标类型能否在任何情况下都不丢失信息(精度除外)。
数值类型:只认“能表示的数的范围”,不看字节大小
合法路径只有两条主线:
- 整数链:byte → short → int → long → float → double
- 字符链:char → int(注意:char 是无符号 16 位,int 是有符号 32 位,0–65535 完全落在 int 范围内)
关键例子:
-
long → float允许自动转换,因为 float 指数范围远超 long,但大 long 值(如Long.MAX_VALUE)转成 float 后末尾整数位会归零——这是精度丢失,不是编译错误,因“范围包含”成立 -
short s = 10; byte b = s;编译失败,因 short(-32768~32767)范围大于 byte(-128~127),存在截断风险,编译器拒绝 -
char c = 200; int i = c;合法,200 在 char 和 int 范围内,自动提升为 200(int)
运算表达式中的隐式提升规则
哪怕没显式赋值,算术运算也会触发自动转换:
立即学习“Java免费学习笔记(深入)”;
- 所有
byte、short、char在参与加减乘除时,一律先升为 int 再计算 - 表达式结果类型由操作数中“最宽类型”决定:例如
int + double → double,float + long → float -
byte b = 5; b = b + 1;编译失败——因为b + 1中的1是 int,整个表达式是 int 类型,不能直接赋给 byte
引用类型:向上转型自动,向下转型必须显式
安全与否取决于继承关系是否可静态证明:
-
Dog d = new Dog(); Animal a = d;自动成立,因为 Dog 是 Animal 的子类,“子类实例可当父类用”语义清晰、无风险 -
Object obj = "hello"; String s = obj;编译失败——虽然 String 确实是 Object 子类,但编译器不允许隐式向下转型;必须写String s = (String) obj;并建议配合instanceof防错 -
null可赋给任意引用类型(不触发类型检查),但后续调用方法会抛NullPointerException
明确禁止的转换:守住语义边界
这些方向连编译都不让过,不是技术限制,而是设计选择:
-
boolean 与任何数值类型互转:不允许
int i = true;或if (1) { ... }——逻辑值和数字含义不同,不混用 -
字符串与基本类型之间无自动或强制语法转换:不允许
int i = "123";或(int)"456"——解析行为需显式调用Integer.parseInt(),失败可抛异常,可控 -
不兼容引用类型间强转:比如
List和Set无继承关系,(List) new HashSet()编译虽过(因都实现Collection?实际编译失败),运行必崩,应新建容器复制


















