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

时间:2015-05-01 11:39:11

标签: 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);
    }
}

代码实际上没有给出编译或运行时错误。将i的数据类型更改为intdoublechar等任何其他数据类型也有效。不仅如此,在声明中引入操作也没有任何错误:

float i = (char)+(int)-(long)(byte) 100;

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

float i = (char) +(int) -(long) (byte) 100;

请帮助我理解如何编译此代码?

2 个答案:

答案 0 :(得分:10)

它基本上只是一系列演员和一元+-

float i = (char) +(int) -(long) (byte) 100;

相当于

byte tmp1 = (byte) 100;
long tmp2 = (long) tmp1;
long tmp3 = -tmp2;
int  tmp4 = (int) tmp3;
int  tmp5 = +tmp4;
char tmp6 = tmp5;
float i = tmp6;

最终作业从charfloat,这是一个扩大的原始转化。见JLS Chapter 5: Conversions and Promotions

  

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

     
      
  • byte to short,int,long,float或double
  •   
  • 简称为int,long,float或double
  •   
  • char 到int,long, float 或双重
  •   
  • int to long,float或double
  •   
  • 长期漂浮或加倍
  •   
  • 浮动加倍
  •   

答案 1 :(得分:0)

像这样考虑:

   float i = ((char) +((int) -((long) ((byte) 100))));

每个步骤都会将结果转换为自己的类型。所以,令人惊讶的是100成了65436.0  因为所有这些中间类型演员。