java operator + =中的隐式转换

我发现java编译使用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中发布此代码块

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

Java语言规范说:

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

所以i += f等于i = (int) (i + f)

我相信明确的i+f因为缩小原始转换而失败。 在第一种情况下,右侧的转换通过,因为它是根据化合物分配规则完成的。