原文鏈接:https://clclcl.fun/2019/11/02/java/Compound-Assignment-Operators/
簡單介紹Java復合賦值運算符(+= -= *= /+ >= >>>= |= &=
)中的類型轉換。
首先看一段代碼:
int i = 10;
long j = 100;
i = i + j; //Compiling error: incompatible types: possible lossy conversion from long to int
i += j; //Correct.
System.out.println(i);
很多人(包括我自己)都簡單的把 i += j
理解為 i = i + j
,那么為什么會出現上面的問題呢?這就得從java規范里,對+=
這類復合賦值運算符的定義了。
什么是復合賦值運算符(Compound Assignment Operators)?
簡單來講,就是運算加賦值,譬如:
+= -= *= /+ >= >>>= |= &=
,統一稱為op=
.在Java規范里,這種運算符的效果是什么呢?
假設兩個變量,A,B,類型分別為TA,TB(當然可能是相同的類型),那么
A op= B
等效於A = (TA)(A op B)
.
這樣回頭去看上面的代碼,就很清楚問題的原因了:
i + j
由於類型的自動提升,結果為long
類型,自然 i = i + j
把long
類型的值賦給int
類型的變量會出錯。而i += j
等效於i = (int)(i + j)
,對long
類型的值做了強制轉換(cast to int).
Also see JAVA語言規范中關於復合賦值運算符 jls-15.2.26.2