延續上一篇的探討,我們透過具體程式碼片段,深入剖析 Java 條件運算子(三元運算子)在型別推導時的具體規則與常見陷阱。
請先看以下程式碼:
char x = 'A';
int i = 0;
System.out.println(true ? x : 0); // line 3
System.out.println(true ? x : 1111111110); // line 4
System.out.println(false ? i : x); // line 5
直覺上,許多人會以為三行都輸出 'A'。但實際執行結果卻是:
'A'
65
65
這背後的原因,在於條件運算子對運算結果型別的嚴格限制規則:
byte、short 或 char(型別 T),另一個為 int 常數表達式,且其值在 T 的範圍內,結果型別為 T。true ? x : 0。表達式 1 為 char,表達式 2 為 int 常數 0,且 0 在 char 範圍內(0~65535),符合規則 2,結果型別為 char,輸出 'A'。true ? x : 1111111110。常數值超出 char 範圍,不符合規則 2,觸發規則 3,char 提升為 int,結果型別為 int,輸出 ASCII 碼 65。false ? i : x。表達式 1 為 int 變數,表達式 2 為 char 變數,無常數表達式,直接依規則 3 提升為 int,輸出 65。Test t = false ? new Object() : new Test();
此處表達式 1 為 Object,表達式 2 為 Test(假設 Test 繼承 Object)。無常數表達式,型別不同,依規則 3 提升至共同父型別 Object。整個條件運算式型別為 Object,嘗試指派給 Test 型別變數,自然導致編譯錯誤(需強制轉型)。
掌握這三條規則,才能在使用條件運算子時避免型別推導帶來的「陣痛」。