代码之家  ›  专栏  ›  技术社区  ›  Luisk4

文字中的隐式转换

  •  1
  • Luisk4  · 技术社区  · 7 年前

    默认情况下,Java假设您使用文字定义int值。

    short x = 20; // There is an implicit conversion
    

    但是,当我们在算术表达式中使用“x”变量时,对于eample:

    short y = x * 2; //DOES NOT COMPILE
    

    我们知道20*2的结果是40,这可以很容易地拟合到一个短变量中。 怎么回事?

    4 回复  |  直到 7 年前
        1
  •  6
  •   OH GOD SPIDERS    7 年前

    因为 x 不是最终的。无法保证当程序达到以下点时,变量仍为20:

    short y = x * 2;
    

    编译器只是考虑到非最终变量x在该时间(通过任何方式)发生变化的可能性,因此不会简单地将其视为20。 如果将x定义为final,则隐式对话将起作用:

    final short x = 20; // There is an implicit conversion
    short y = x * 2; //DOES COMPILE
    
        2
  •  0
  •   Lalit Verma    7 年前

    当你写作时 short x =20 然后java成功地编译了它,但是当您编写 short y=x *2 然后它将被视为int,您必须将其转换为像 short y =(short)x*2

        3
  •  0
  •   gdlamp    7 年前

    我不知道编译器实现的细节。我想原因是编译器无法进行检查,因为x的值在编译时可能未知。所以它只能假设它是一个int。否则,您希望编译器的行为如何?

    如果你看一下*运算符原型 请参阅: https://www.cs.cmu.edu/~pattis/15-1XX/15-200/lectures/voe/lecture.html

    (int,int)只有一个,所以从技术上讲,(short,short)没有一个。

    那么你可能会问为什么短x=20有效? 原因是Java只能允许自动转换为短值,如果它是一个常数,在这种情况下,“20”是最终值,而x*2不是最终值 看见 Java - short and casting

        4
  •  0
  •   Przemysław Moskal    7 年前

    您可以使用以下符号使用强制转换将算术运算的结果分配给 y (如果您不想 x final ) :

    short y = (short)(x * 2);
    

    我认为答案在Java语言规范中。请看第4.2.2点,有一个数值运算符列表,这些运算符会导致int或long类型的值,这就是为什么java将其视为int并需要强制转换的原因: https://docs.oracle.com/javase/specs/jls/se9/html/jls-4.html#jls-4.2.2