Java隐式转换

Cra*_*acs 6 java java-ee implicit-conversion

使用以下代码:

Float a = 1.2;
Run Code Online (Sandbox Code Playgroud)

有一个错误,因为它将十进制作为double值,并且double是一个更大的数据类型float.

现在,它将整数作为默认int类型.那么,为什么以下代码没有给出任何错误?

Byte b = 20;
Run Code Online (Sandbox Code Playgroud)

Ted*_*opp 7

编译器非常聪明,int可以确定20(一个值)的位表示可以适合于a byte而不会丢失数据.从Java语言规范§5.1.3开始:

从A基本收缩转换doublefloat由IEEE 754的舍入规则支配(§4.2.4).这种转换可能会失去精度,但也会失去范围,导致float非零的零doublefloat有限双的无穷大.甲doubleNaN被转换成float的NaN和double无穷被转换成相同的签名float无穷大.

将有符号整数缩小到整数类型T只会丢弃除n个最低位之外的所有位,其中n是用于表示类型T的位数.除了可能丢失有关数值大小的信息之外,这可能导致结果值的符号与输入值的符号不同.

见此主题.