Условный оператор Java?: Тип результата
Я немного озадачен условным оператором. Рассмотрим следующие две строки:
Float f1 = false? 1.0f: null;
Float f2 = false? 1.0f: false? 1.0f: null;
Почему f1 становится нулевым, а второе выражение генерирует исключение NullPointerException?
Langspec-3.0 пункт 15.25 говорит:
В противном случае второй и третий операнды имеют типы 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.