Это описано в спецификации языка Java Раздел 15.25 (соответствующие части выделены жирным шрифтом):
Тип условного выражения определяется следующим образом:
Если второй и третий операнды имеют одинаковый тип [...]
Если один из второго и третьего операндов имеет тип boolean [...]
Если один из второго и третьего операндов имеет нулевой тип [...]
В противном случае, если второй и третий операнды имеют типы , которые можно преобразовать (§5.1.8) в числовые типы, то существует несколько случаев:
Если один из операндов имеет тип байта [...]
Если один из операндов имеет тип T, где T является байтом, коротким или символом, [...]
Если один из операндов имеет тип Byte [...]
Если один из операндов имеет тип Short [...]
Если один из операндов имеет тип; Символ [...]
В противном случае двоичное числовое продвижение (§5.6.2) применяется к типам операндов, а тип условного выражения является продвинутым типом второго и третьего операндов. Обратите внимание, что двоичное числовое продвижение выполняет преобразование без коробки (§5.1.8) и преобразование набора значений (§5.1.13).
В противном случае второй и третий операнды имеют типы S1 и S2 соответственно. Пусть T1 будет типом, который следует из применения преобразования в бокс для S1, и пусть T2 будет типом, который следует из применения преобразования в бокс в S2. Тип условного выражения является результатом применения преобразования захвата (§5.1.10 ) до lub (T1, T2) (§15.12.2.7).
"lub", упомянутый в последнем абзаце, обозначает наименьшая верхняя граница и относится к наиболее конкретному супертипу, обычному для T1 и T2.
Что касается случая с Object val = true ? 1l : 0.5;
, я согласен, что было бы более точным, если бы он применил правило 5 (для значений в штучной упаковке). Я предполагаю, что правила станут двусмысленными (или даже более сложными), если принять во внимание автобокс. К какому типу относится, например, выражение b ? new Byte(0) : 0.5
?
Однако вы можете заставить его использовать правило 5, выполнив
Object val = false ? (Number) 1L : .5;