【问题标题】:Why aren't op-assign operators type safe in java?为什么在 java 中 op-assign 运算符类型不安全?
【发布时间】:2010-10-10 02:30:35
【问题描述】:

我不确定这个问题的措辞是否清楚,但举个例子会更清楚。

我发现这在 Java 中不起作用:

int a = ...;
a = 5.0;

但这会:

int a = ...;
a += 5.0;

也就是说,= 运算符似乎是类型安全的,但 += 不是。 这是否有任何深层原因,或者它只是语言设计者必须做出的另一个任意决定。

【问题讨论】:

    标签: java types operators language-features


    【解决方案1】:

    原因是数学运算做了一些隐式转换:

    a += 5.0; 的评估如下:

    a = (int) ((double) a + 5.0);
    

    然而,赋值需要显式转换。

    (它可能是浮点数而不是双精度数,我不记得 Java 将哪个视为十进制文字。)

    【讨论】:

    • 但为什么要进行最后的转换回 int 呢?
    • (double, f 前缀为浮点数。我相信 JavaFX 1.0 使用 double 而 1.1 使用浮点数。)
    • mipadi,我的意思是为什么它表现得如此友好? "a = a + 5.0" 也失败了。它也可以说“a += 5.0”失败。 Tom Hawtins 的回答提供了一些理由,但我仍然很难想象为什么 java 不只是禁止它,而是引入了另一个转换上下文(正确的词?)
    【解决方案2】:

    让生活更轻松。

    让我们走得更远一点。考虑:

    byte b;
    ...
    ++b;
    

    增量确实在做:

    b = (byte)(1 + (int)b);
    

    即使使用+= 也好不到哪里去:

    b += b;
    

    是:

    b = (byte)((int)b+(int)b);
    

    这将使这些运算符对字节/短/字符无用。

    当然,除非我们有任意大小的整数,否则我不会高兴。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-25
      • 2017-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多