Java走码观花-复合运算符中的强制转换

6次阅读

共计 814 个字符,预计需要花费 3 分钟才能阅读完成。

今天讨论的问题是“符合运算符中的强制转换”。以 += 为例,我编写了如下代码,你可以先考虑下为什么会出现下面这种情况。

这个问题可以从“Java 语言手册”中可以找到答案,原文如下:

A compound assignment expression of the form E1 op= E2 
is equivalent to E1 = (T) ((E1) op (E2)), 
where T is the type of E1, except that E1 is evaluated only once.

意思是说,形如 E1 op= E2 的复合赋值表达式等价于 E1 = (T)((E1) op (E2)), 其中,T 是 E1 的类型。所以,回到本例,i+j 的结果会强制转换成 int 再赋值给 i。

其实验证也比较容易,我们看下编译后的 .class 文件就知道做了什么处理。

从 .class 文件可以看出,有两处强制转换。第一处是 i+j 时,由于 j 是 long 类型,因此 i 进行类型提升,强转为 long,这个过程我们比较熟悉。第二处是我们今天讨论的内容,i+j 的结果强转成了 int 类型。
这里面我们还可以在进一步思考,因为在这个例子中强转可能会导致计算结果溢出,那你想想为什么 Java 设计的时候不让它报错呢?
我的猜想是这样的,假设这里报错了,我们看看会有什么样的后果。比如在 byte 或者 short 类型中是 += 运算符。

按照我们的假设,这里就会报错,因为 i+1 返回的 int 类型。然而实际应用场景中这种代码很常见,因此,将会严重影响复合赋值运算符的应用范围,最终设计出来可能就是一个比较鸡肋的东西。所以,为了普适性只能把判断交给用户,让用户来保障使用复合赋值运算符不会发生溢出。我们平时应用时一定要注意这个潜在的风险。
对你有参考价值,同时也欢迎留言区交流你的想法。

本例来源:https://stackoverflow.com/que…
JSL:https://docs.oracle.com/javas…

欢迎关注公众号「渡码」,每天都有分享

正文完
 0