3 回答

TA貢獻1824條經(jīng)驗 獲得超5個贊
這不會編譯,因為我們不能將空值分配給原始類型的變量
boolean e = null;
這也沒有編譯,雖然有判斷,但是編譯器檢測到該值始終為null并且與前面的情況相同
boolean f = c ? null : null;
在這種情況下,由于編譯器不知道 b 的最終值,因此代碼可以編譯,但由于最終值為 null 而無法運行
boolean c = true;
boolean d = true;
boolean b = c ? null : d;

TA貢獻1963條經(jīng)驗 獲得超6個贊
三元表達式中的類型必須是相同的 type,所以我猜JLS 說在這種情況下這些類型是自動裝箱的(它會變成Boolean);考慮到檢查/優(yōu)化javac做的很少,這里沒有做。有趣的是,intellij 確實會抱怨,例如會拋出一個潛力 NullPointerException。
對我來說,這在某種程度上屬于同一類別:
String s = null;
if (true == true) {
}
if(s == null) {
}
等等......它們在編譯時對我們來說都是已知的,但對于編譯器來說卻不是。
有點不相關(guān),但三元運算符遠非if statement,Holger 曾經(jīng)向我展示了這個很棒的促銷示例:
boolean b = true;
Object result = b ? Integer.valueOf(42) : Long.valueOf(12);
System.out.println(result.getClass() + " " + result); // class java.lang.Long 42
添加回答
舉報