为啥Java在使用“加号”运算符时会执行从双精度到整数的隐式类型转换? [复制]
Posted
技术标签:
【中文标题】为啥Java在使用“加号”运算符时会执行从双精度到整数的隐式类型转换? [复制]【英文标题】:Why does Java perform implicit type conversion from double to integer when using the "plus equals" operator? [duplicate]为什么Java在使用“加号”运算符时会执行从双精度到整数的隐式类型转换? [复制] 【发布时间】:2012-01-06 13:00:46 【问题描述】:可能重复:Varying behavior for possible loss of precision
代码示例 A
public class Test
public static void main(String[] args)
int i = 0;
i = i + 1.5;
代码示例 B
public class Test
public static void main(String[] args)
int i = 0;
i += 1.5;
不出所料,编译 A 会产生以下错误。 出人意料地,编译 B 不会产生任何错误,而且它的表现就像我在双精度值 1.5 之前插入了一个显式转换为整数一样。为什么会发生这种情况?这与我以为我知道的一切背道而驰!
Test.java:6: possible
loss of precision
found : double
required: int
i = i + 1.5;
^
1 error
【问题讨论】:
@Dave 在令人不安的部分是正确的。哦,没有语言是完美的。 :) 【参考方案1】:它按设计工作。复合运算符向操作添加了隐式强制转换。否则,您必须使用显式强制转换。
更多信息?
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.26.2
【讨论】:
+1 很好的答案,但这里有一个更直接的链接:java.sun.com/docs/books/jls/third_edition/html/… 这个链接很公平。谢谢! 太棒了,谢谢你的链接,雷。 说“这就是他们想要的工作方式”与回答为什么它以这种方式工作的问题不同。任何人都可以为这个决定提供理由吗?从表面上看,在其他任何地方都需要显式转换的语言中,静默转换似乎很容易出错。 @EricLindauer:我希望它可以正常工作,因为算术运算符永远不会给出小于int
的任何类型的结果,但 Java 希望允许 +=
可用于较小的类型,并且Java 优先考虑使类型转换规则简单和“一致”,而不是允许有意义的事情而禁止可能错误的事情。【参考方案2】:
根据Java language specification, section 15.26.2:
E1 op= E2 形式的复合赋值表达式等价于 E1 = (T)((E1) op (E2)),其中 T 是 E1 的类型,除了 E1 只计算一次。 例如下面的代码是正确的:
short x = 3;
x += 4.6;
并导致 x 的值为 7,因为它等价于:
short x = 3;
x = (short)(x + 4.6);
【讨论】:
以上是关于为啥Java在使用“加号”运算符时会执行从双精度到整数的隐式类型转换? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥需要使用加号运算符 (Iterator<Item = &Foo> + 'a) 为特征添加生命周期?