Java隐式转换

时间:2015-08-27 17:26:35

标签: java java-ee implicit-conversion

使用以下代码:

Float a = 1.2;

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

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

Byte b = 20;

2 个答案:

答案 0 :(得分:7)

编译器非常聪明,可以确定20(int值)的位表示可以适合byte而不会丢失数据。来自Java Language Specification §5.1.3

  

doublefloat的缩小基元转换由IEEE 754舍入规则(§4.2.4)控制。此转换可能会失去精确度,但也会失去范围,导致非零float的{​​{1}}零和有限双的double无穷大。 float NaN转换为double NaN,float无穷大转换为同一个double无穷大。

     

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

另见this thread

答案 1 :(得分:1)

通常没有隐式缩小转换 - 常量表达式是唯一的例外,JLS 5.2明确允许它们:

  

此外,如果表达式是byte,short,char或int类型的常量表达式(第15.28节):

     

*如果变量的类型是byte,short或char,则可以使用缩小的原语转换,并且常量表达式的值可以在变量的类型中表示。

没有提到浮点数允许隐式缩小转换,因此根据一般规则禁止它们。