Когда второй и третий операнды условного оператора являются числами разных типов, применяется двоичное числовое продвижение , чтобы они были одного типа.
В этом случае Double
распаковывается в double
;Integer
распаковывается до int
, а затем расширяется до double
.
Другими словами, это происходит:
System.out.println(true? (double) a.intValue() : b.doubleValue());
Именно так определяется условный операторвести себя.
Обратите внимание, что это поведение считается достаточно вопиющим, что это ошибка компилятора в коде Java Google .
Если вы хотите сохранить операндыкак их «настоящие» типы, вам нужно будет привести их, скажем, к Number
:
System.out.println(true ? (Number) a : (Number) b);
будет печатать 1
.