Ваш код эквивалентен:
public static boolean accept(File pFile) {
System.out.println(pFile.exists()); // prints: false, so pFile is not null
Boolean tmp = pFile.exists() ? true : null;
return (boolean) tmp;
}
Другими словами, в этом случае тип условного оператора равен Boolean
, а затем значение распаковывается, чтобы вернуть boolean
.Когда null
распакован, вы получаете исключение.
Из раздела 15.25 Спецификации языка Java:
В противном случае второй и третий операндытипов S1 и S2 соответственно.Пусть T1 будет типом, который следует из применения преобразования бокса в S1, и пусть T2 будет типом, который следует из применения преобразования бокса в S2.Тип условного выражения является результатом применения преобразования захвата (§5.1.10) к lub (T1, T2) (§15.12.2.7).
Я полагаю, что это применимо здесь, хотя я допускаю, что это не так ясно, как могло бы быть.