为什么 Java 中的复合赋值不能捕获溢出问题?
2022-09-04 22:48:55
令我震惊的是,事实证明,以下代码将在没有警告的情况下编译:
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 只计算一次。
这在我看来是荒谬的。为什么他们觉得有必要明确地在这里投射?似乎自动类型转换无论如何都会处理加宽,并且像这样自动变窄几乎可以保证会导致整数溢出。