Я немного озадачен условным оператором. Рассмотрим следующие две строки:
Float f1 = false? 1.0f: null;
Float f2 = false? 1.0f: false? 1.0f: null;
Почему f1 становится нулевым, а второй оператор генерирует исключение NullPointerException?
Langspec-3.0 para 15.25 sais:
В противном случае второй и третий операнды имеют типы S1 и S2 соответственно. Пусть T1 - тип, который возникает в результате применения преобразования бокса в S1, и пусть T2 - тип, который возникает в результате применения преобразования бокса в S2. Тип условное выражение является результатом применения преобразования захвата (§5.1.10) в lub (T1, T2) (§15.12.2.7).
Итак, для false?1.0f:null
T1 - Float, а T2 - нулевой тип. Но каков результат lub(T1,T2)
? Этот параграф 15.12.2.7 просто слишком много...
Кстати, я использую 1.6.0_18 в Windows.
PS: Я знаю, что Float f2 = false? (Float) 1.0f: false? (Float) 1.0f: null;
не бросает NPE.