題目程式碼
package Oct2016;
public class Ques1020 {
public static void main(String[] args) {
int num = 10;
String str01 = String.valueOf(num < 30 ? 20 : 30);
String str02 = String.valueOf(num < 30 ? 20 : 30.0);
System.out.println("str01與str02是否相等:" + str01.equals(str02));
}
}
輸出結果
str01與str02是否相等:false
深度解析
第一個三元運算式:num < 30 ? 20 : 30
- 條件為真,結果為
20(int 常量)。
- 整個運算式型別為
int(兩邊皆為 int)。
String.valueOf(int) 回傳 "20"。
第二個三元運算式:num < 30 ? 20 : 30.0
- 條件為真,結果為
20,但編譯期型別推導基於兩分支:
- 真分支:
20 (int);假分支:30.0 (double)。
- 根據 JLS 15.25,
int 與 double 二元數值提升為 double。
- 整個運算式編譯期型別為
double,執行期值為 20.0。
String.valueOf(double) 回傳 "20.0"。
比較結果
str01 = "20"
str02 = "20.0"
"20".equals("20.0") → false
核心知識點總結
- 三元運算式型別由兩分支決定,而非執行期實際值。即使條件為真,假分支型別仍參與型別推導。
- 基本型別數值提升規則:
byte/short/char → int → long → float → double。
String.valueOf 重載方法依編譯期靜態型別分派,int 與 double 產生不同字串表示。
- 實務建議:避免三元運算式兩分支型別不一致,或顯式轉型統一型別(如
(double) 20)。
