Согласно JLS : -
Тип условного выражения определяется следующим образом:
blockquote>
- Если второй и третьи операнды имеют один и тот же тип (который может быть нулевым типом), то это тип условного выражения.
- Если один из второго и третьего операндов имеет примитивный тип T, а тип другой - результат применения преобразования бокса (п. 5.1.7) в Т, тогда тип условного выражения равен T.
Так оно и должно работать. Тернарный оператор не означает эквивалент регулярного оператора if
. Телами if
и else
являются утверждения , а части, следующие за ?
и :
, являются выражениями , которые должны оцениваться одним и тем же типом .
Иными словами: a = b ? c : d
не должен быть эквивалентен if (b) a = c; else a = d;
. Вместо этого b ? c : d
является выражением само по себе, а присвоение его результата a
не повлияет на результат.
Проблема заключается в том, что:
Integer number = (condition) ? getNumber() : 0;
Заставляет распаковать и переустанавливать результат getNumber (). Это связано с тем, что ложная часть тройки (0) является целым числом, поэтому она пытается преобразовать результат getNumber () в int. В то время как следующее не делает:
Integer number = (condition) ? getNumber() : (Integer) 0;
Это не ошибка, просто то, как Java решила что-то делать.