日常开发中经常接触到的数据类型转换主要有这2种:
- 原始数据类型之间的转换
- 字符串、原始数据类型、日期类型之间的转换
对于原始数据类型之间的转换,从代码是否直接使用强制转换来看,又分为显式转换和隐式转换,即
- 自动类型转换/隐式类型转换:编译器自动添加的类型转换
- 强制类型转换/显式类型转换:代码中直接写出需要强制转换的类型
接下来主要列举原始数据类型隐式转换的一些场景:
- 所有byte、char、short类型的计算都默认提升到int类型再计算:
-
- byte + byte → int
- byte + char → int
- byte + short → int
- char + char → int
- char + short → int
- short + short → int
- byte/char/short + int → int
- 如果参与计算的有long类型,则会提升至long类型进行计算:
-
- byte + long → long
- char + long → long
- short + long → long
- int + long → long
- 常量整数默认是int类型,只要在对应的 byte / char / short 范围内的,都可以默认转换,如 byte b = 1;,除非超过对应类型的范围
-
- The literal 2147483648 of type int is out of range
- 小范围数据类型向大范围数据类型赋值也是可以直接转换的(跳跃转换也可以)
-
- byte → short → int → long → float → double
- char → int → long → float → double
- 部分运算符会有默认转换,如 ++、--、+=、-=、/=、*=、%= 等(最后的结果强制转换后可能存在精度损失)。
原始数据类型的类型转换可以参考Java语言规范相关说明:
- [1]5.1.2. Widening Primitive Conversion https://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.1.2
- [2]5.1.3. Narrowing Primitive Conversion https://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.1.3