2017-05-09 117 views
3

我尝试以下的代码:速记操作者给出了两个不同的结果

class Converter{ 

    public static void main(String args[]) { 
     byte num = 1; 
     num = num * 2.5; // line 1 
     System.out.println("Result is : "+num); 
    } 
} 

所以编译器发出一个错误为:

error: incompatible types: possible lossy conversion from double to the byte at line 1 

在以后,我改变了线1与速记运算符= *:

class Converter{ 

     public static void main(String args[]) { 
      byte num = 1; 
      num *= 2.5; 
      System.out.println("Result is : "+num); 
     } 
    } 

它的编译和输出成功运行:

Result is:2 

我可以知道,简写操作符在JAVA中的工作方式不同。为什么会这样呢?

+1

为什么你认为它would'nt发生?它基本上做'x =(byte)(x * y)'。所以它有一个隐式类型转换。我的意思是第一个错误已经警告过你,当从'double'转换为'byte'时,类型转换会使你失去精确度 – SomeJavaGuy

+0

使用'javap -v Converter.class'来查看第二种情况发生了什么。请特别注意d2i和i2b指令:) – TheLostMind

+0

所以我可以这么说速记运算符能够抑制有损转换错误,并且只是简单地做了什么输入呢? – Kamalakar

回答

9

从JLS compound assigment operator文档,可以看到下面的例子:

例如,下面的代码是正确的:

short x = 3; 
x += 4.6; 

和具有该值的结果以x因为它相当于:

short x = 3; 
x = (short)(x + 4.6); 

它只是默认自动转换结果。

PS:在此other answer我试图解释,你需要转换就像使用JLS

short x = 3; 
x = x + 1; //Won't compile 

据realativly新,所以我愿意接受建议有以下操作的原因。

1

如已经由AxelH表示,它是一个compound assignement但我想uderline此:

形式E1 op= E2的化合物赋值表达式是等效 到E1 = (T) ((E1) op (E2)),其中TE1类型,除了E1 仅评估一次。

这意味着根据定义它是铸造结果。例如:

byte b = 1; 
b *= 2.3; 
System.out.println(b); // prints 2 

从您的评论:

所以我可以说,速记运营商抑制有损转换 错误,只是做什么输入它?

不,你不能。它不会抑制任何错误,因为在投射时没有错误(在这种情况下)。

+0

@AxelH我认为你的答案很好。我也upvoted。但我只是想强调为什么会发生这种情况。现在阅读OP的评论引导我更好地解释说,它不会抑制任何错误。相反,它是铸造。这是不同的。 – granmirupa

+0

我同意,顺便说一下,你的例子应该使用'b = 1'而不是'b = 10'来显示有损转换;} – AxelH

+0

@AxelH是肯定的.. [lapsus](https://en.wikipedia .org/wiki/Lapsus):) – granmirupa

1

根据java语言规范"15.26.2. Compound Assignment Operators"

形式E1 OP的化合物赋值表达式= E2相当于 到E1 =(T)((E1)OP(E2)),其中T是E1的类型,不同的是E1 被评估只有一次。

你可以在编译后看到你的例子的字节码(检查instruction 3-10)。

3: i2d //convert an int into a double 
    4: ldc2_w   #2     // double 2.5d 
    7: dmul //multiply two doubles 
    8: d2i // convert a double to an int 
    9: i2b //convert an int into a byte 
    10: istore_1 //store int value into variable 1 

enter image description here

相关问题