在Java程序中单行进行多个类型转换

Bho*_*oot 10 java casting type-conversion

在今天乱搞Java语法的同时,我尝试编译以下java代码:

class Mess {
    public static void main(String[] args) {
        float i = (char)(int)(long)(byte) 100;
        System.out.println(i);
    }
}
Run Code Online (Sandbox Code Playgroud)

代码实际上没有给出编译或运行时错误.更改的数据类型i为任何其他数据类型一样int或者doublechar工作过.不仅如此,在声明中引入操作也没有任何错误:

float i = (char)+(int)-(long)(byte) 100;
Run Code Online (Sandbox Code Playgroud)

当我在Netbeans中使用自动格式来格式化代码时,上面的声明格式如下:

float i = (char) +(int) -(long) (byte) 100;
Run Code Online (Sandbox Code Playgroud)

请帮助我理解这段代码是如何编译的?

aio*_*obe 10

它基本上只是一个演员链和一元+-.

float i = (char) +(int) -(long) (byte) 100;
Run Code Online (Sandbox Code Playgroud)

它相当于

byte tmp1 = (byte) 100;
long tmp2 = (long) tmp1;
long tmp3 = -tmp2;
int  tmp4 = (int) tmp3;
int  tmp5 = +tmp4;
char tmp6 = tmp5;
float i = tmp6;
Run Code Online (Sandbox Code Playgroud)

最后的赋值来自charto float,这是一个扩展的原始转换.请参阅JLS第5章:转换和促销

对原始类型的19个特定转换称为扩展原始转换:

  • byte to short,int,long,float或double
  • 短,int,long,float或double
  • char到int,long,float或double
  • int到long,float或double
  • 长期浮动或加倍
  • 漂浮加倍