令我震惊的是,以下代码甚至可以在没有警告的情况下编译:
public void test()
{
int value = 2000000000;
long increment = 1000000000;
value += increment;
}
而正如您所期望的那样,这会产生编译时错误:
public void test()
{
int value = 2000000000;
long increment = 1000000000;
value = value + increment;
}
我查了一下,确实,JLS(第 15.26.2 节)有这样的说法:
E1 op = E2 形式的复合赋值表达式等价于 E1 = (T) ((E1) op (E2)),其中 T 是 E1 的类型,除了 E1 只计算一次。
这对我来说似乎很荒谬。为什么他们觉得有必要在这里明确投射?似乎自动类型转换无论如何都会处理扩大,并且像这样自动缩小几乎可以保证导致整数溢出。