java operator + =中的隐式转换

时间:2012-12-08 19:30:11

标签: java compiler-errors implicit-conversion

我发现java compile在使用int和float的赋值和自赋值语句方面有一个非期望的行为。

以下代码块说明了错误。

    int i = 3;
    float f = 0.1f;

    i += f;              // no compile error, but i = 3
    i = i + f;           // COMPILE ERROR
  • 在自我赋值i += f中,编译不会发出错误,但是exaluation的结果是值为3的int,变量i维护价值3

  • i = i + f表达式中,编译器发出错误“错误:可能丢失精度”消息。

有人可以解释这种行为。

编辑:我已在https://compilr.com/cguedes/java-autoassignment-error/Program.java

中发布了此代码块

2 个答案:

答案 0 :(得分:11)

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.26.2

Java语言规范说:

  

E1 op= E2形式的复合赋值表达式等同于E1 = (T) ((E1) op (E2)),其中TE1的类型,但E1仅被评估一次。

因此i += f相当于i = (int) (i + f)

答案 1 :(得分:0)

我认为明确的i+fNarrowing primitive conversion而失败。在第一种情况下,右侧的转换是通过的,因为它是根据Compound Assignment rules.

完成的