【问题标题】:implicit conversion in java operator +=java运算符中的隐式转换+=
【发布时间】:2012-12-08 19:30:11
【问题描述】:

我发现 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中,编译不会报错,但计算的结果是一个值为3的int,变量i保持值3

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

谁能解释一下这种行为。

编辑:我已经在https://compilr.com/cguedes/java-autoassignment-error/Program.java 中发布了这个代码块

【问题讨论】:

  • Java 语言规范是您可以找到解释的地方。它可以在线免费获得。
  • 公平地说,“第 5 章。转换和促销”是我在遇到这个问题之前会(并且已经)看过的地方;第 15 章甚至没有出现在寻找“Java 隐式缩小转换”的第一页上。没有找到信息并不一定是不搜索的标志,您的评论没有任何帮助

标签: java compiler-errors implicit-conversion


【解决方案1】:

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)

【讨论】:

    【解决方案2】:

    我相信显式的i+f 会因为Narrowing primitive conversion 而失败。而在第一种情况下,右侧的转换通过了,因为它是根据Compound Assignment rules.

    【讨论】:

      猜你喜欢
      • 2010-10-27
      • 2019-01-08
      • 2013-08-25
      • 2017-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多