首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2SE

J2SE 核心技術:深入解析條件運算子的型別推導陷阱 (下)

     編輯:J2SE

案例理論深度分析

延續上一篇的探討,我們透過具體程式碼片段,深入剖析 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

這背後的原因,在於條件運算子對運算結果型別的嚴格限制規則:

  1. 同型別原則:若表達式 1 和 2 型別相同,整個運算結果即為該型別。
  2. 常數表達式窄化規則:若一個運算元為 byte、short 或 char(型別 T),另一個為 int 常數表達式,且其值在 T 的範圍內,結果型別為 T。
  3. 型別提升原則:除上述情況外,若兩運算元型別不同,將進行型別提升,結果型別為提升後的型別。

逐行解析

  • Line 3:true ? x : 0。表達式 1 為 char,表達式 2 為 int 常數 0,且 0 在 char 範圍內(0~65535),符合規則 2,結果型別為 char,輸出 'A'。
  • Line 4:true ? x : 1111111110。常數值超出 char 範圍,不符合規則 2,觸發規則 3,char 提升為 int,結果型別為 int,輸出 ASCII 碼 65。
  • Line 5: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 型別變數,自然導致編譯錯誤(需強制轉型)。

掌握這三條規則,才能在使用條件運算子時避免型別推導帶來的「陣痛」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved