2012-03-13 44 views
0

我正在使用Java和新的它。奇怪的类型转换,同时做variableOfTypeA + = variableOfTypeB

当我尝试

int integerValue = 100; 
long longValue = 100; 
integerValue = integerValue + longValue; 

我得到 “类型不匹配:不能从长到int转换”。

integerValue+=longValue; 

工作正常,这意味着它是做演员对我来说:)

有什么事情 “+ =” 本身就具有?任何具体原因?

编辑:哎呀!太常见的问题! :)我应该先彻底搜索,我的坏!

+0

http://stackoverflow.com/questions/8272635/why-does-java-perform-implicit-type-conversion-from-double-to-的重复整数当使用 – sw1nn 2012-03-13 14:37:49

+0

可能重复的[可能会损失的行为精度](http://stackoverflow.com/questions/2696812/varying-behavior-for-possible-loss-of-precision) – 2012-03-13 14:50:31

回答

3

是的,这与section 15.26.2 of the JLS的解释完全相同。

形式E1 op= E2的化合物赋值表达式是等效于E1 = (T) ((E1) op (E2)),其中TE1类型,不同之处在于E1只计算一次。

1

使用操作赋值运算符有一个隐式转换。

int i = 10; 
i *= 5.5; 
// same as 
i *= (int) (i * 5.5); 

甚至

char ch = '5'; 
ch /= 1.1; // ch = '0' 
1

这是正确的。在第一个示例中,您必须投射到int,因为左表达式的结果值为long值(仅因为longValuelong)。

integerValue = (long) (integerValue + longValue); // this works 

+=运算符执行(相同)铸造隐含性。

这两种行为都是在Java语言规范中指定的。

2

您发现了Java Puzzlers book的Tweedledum拼图。 基本上,复合赋值执行类型转换,而普通赋值不转换。详情请参阅JLS