смешивание Integer и Double в условном выражении - PullRequest
0 голосов
/ 29 сентября 2018

Из книги Java:

При смешивании типов Integer и Double в условном выражении значение Integer распаковывается, переводится в double и помещается в Double:

    Integer a = 1;
    Double b = 2.0;
    System.out.println(true? a : b); // 1.0

Для меня это был неожиданный результат.Как это Integer превращается в Double в этом условном выражении?

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Когда второй и третий операнды условного оператора являются числами разных типов, применяется двоичное числовое продвижение , чтобы они были одного типа.

В этом случае 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.

0 голосов
/ 29 сентября 2018

Это нормально, это связано с компилятором Java, если у вас есть эта строка кода:

  Integer x = true?a:b;

будет ошибка компиляции, вы должны либо привести к Integer, чтобы изменить x на Double,поскольку компилятор не проверяет условное выражение до времени выполнения, результатом может быть значение Double, в вашем случае System.out.println на самом деле печатает double.

Надеюсь, что ответим на ваш вопрос.

...