知识点:
复合赋值操作符会悄悄地产生一个转型。
Java语言规范中讲到,复合赋值 E1 op= E2 等价于简单赋值E1 = (T)((E1)op(E2)),
其中 T 是E1 的类型,除非E1 只被计算一次。
问题:
short x = 0;
int i = 123456;
x += i;// 包含了一个隐藏的转型。语句合法,但是逻辑上有问题
x = x + i; // 语法错误。无法通过编译,丢失精度
结果是不是出乎大家的意料呢?的确如此。
产生这个结果的原因:
Java语言规范中讲到,复合赋值 E1 op= E2 等价于简单赋值E1 = (T)((E1)op(E2)),
其中 T 是E1 的类型,除非E1 只被计算一次。
解决方法:
总结:
总之,复合赋值操作符会悄悄地产生一个转型。如果计算结果的类型宽于变量的 类型,那么所产生的转型就是一个危险的窄化转型。这样的转型可能会悄悄地丢 弃掉精度或数量值。对语言设计者来说,也许让复合赋值操作符产生一个不可见 的转型本身就是一个错误;对于在复合赋值中的变量类型比计算结果窄的情况, 也许应该让其非法才对。 |