Ответ 1
Что происходит, так это то, что компилятор Java сначала пытается сделать типы выражений по обе стороны от :
равными. В этом случае он отключает 5
до Integer
; обратите внимание, что null
является допустимым значением для Integer
. Результат всего тройного выражения равен Integer
. Вы назначаете это int
, поэтому Integer
затем автоматически запускается.
По сути, компилятор применяет autoboxing и -unboxing, чтобы строка выглядела так:
int test = (something != 0 ? Integer.valueOf(5) : null).intValue();
В самом деле, autounboxing null
приводит к NullPointerException
.
Итак, почему java-компилятор не воспринимает такие глупости?
Поскольку разработчики языка Java определили язык таким образом, что он работает так и не решил, что это должно рассматриваться как ошибка...
Раздел 15.25 Спецификации языка Java объясняет, как определяется тип всего выражения.