为什么在整数的情况下无需显式转换?

时间:2019-06-24 06:45:42

标签: java casting integer

Trim(result)

在这种情况下,我需要将byte a=10; byte b=20; b=a+b; 显式转换为这样的字节:

a+b

与short相同:

b=(byte)(a+b);

否则会给出错误。

但是对于整数,不需要显式转换:

short x=23;
short y=24;

这可以正常工作。

那是为什么?

即使在很长的情况下,我们也不需要显式投射。

3 个答案:

答案 0 :(得分:7)

如果您查看JLS 4.2.2 Integer Operations,它指出两个整数操作数之间的数字运算结果是intlong。由于没有从intbyteshort的隐式转换,因此需要显式转换。

答案 1 :(得分:3)

如果您引用的是JLS Sec 15.18.2,它涉及数字类型的添加,它说:

  

对操作数(第5.6.2节)执行二进制数值提升。

     

...

     

数字操作数上加法表达式的类型是其操作数的提升类型。

JLS Sec 5.6.2描述了二进制数值提升

  
      
  1. 如果任何操作数是引用类型,则将其进行拆箱转换(第5.1.8节)。

  2.   
  3. 通行基元转换(第5.1.2节)适用于转换以下规则指定的一个或两个操作数:

         
        
    • 如果其中一个操作数的类型为double,则另一个将转换为double。

    •   
    • 否则,如果其中一个操作数的类型为float,则另一个将转换为float。

    •   
    • 否则,如果其中一个操作数的类型为long,则另一个将转换为long。

    •   
    • 否则,两个操作数都将转换为int类型。

    •   
  4.   

因此,在intlong(两个操作数均为该类型)的情况下,二进制数值提升是不可操作的:操作数仍为int和{{ 1}},并且相加的结果分别为longint,这意味着可以将结果分配给该类型的变量。

longbyte的情况下,二进制数值提升导致将两者都扩展为short来执行加法,加法的结果为{{1 }};您必须再次明确地返回较窄的类型,因为并非所有int值都适合intint


此要求有两个例外,以进行显式缩小强制转换。

首先,复合作业:这本来可以工作:

byte

因为,如JLS Sec 15.26.2中所述:

  

格式为short的复合赋值表达式与b += a; 等效,其中E1 op= E2E1 = (T) ((E1) op (E2))的类型,除了T仅被求值一次。

换句话说:编译器为您插入演员表:

E1

第二,如果操作数具有常量值,并且已知加法结果适合较窄类型的范围,则在变量声明中进行赋值。

>

例如:

E1

这不需要强制转换。

答案 2 :(得分:2)

随着Java的增加,java会将较小的数据类型提升为较大的数据类型。当数据类型小于int时,它将同时将操作数提升为int。看看:Promotion in Java?