Вычисление выражения в Java, содержащего условный оператор - PullRequest
1 голос
/ 10 июля 2020

Посмотрите на следующее java выражение:

srcVariableValue = 
     ((leftRealValue instanceof Integer) ? ((Integer) leftRealValue) : ((Double) leftRealValue)) 
     + 
     ((rightRealValue instanceof Integer) ? ((Integer) rightRealValue) : ((Double) rightRealValue));

Когда оно выполняется, если leftRealValue и rightRealValue имеют значение Integer, результатом будет Double.

Например:

  • rightRealValue = 1 тип Integer
  • leftRealValue = 0 тип Integer

Результат:

  • srcVariableValue = 1.0 тип Double

Это ожидаемое поведение? Конечно, переключение на оператор if работает хорошо, результат имеет тип Integer.

Я использую Java 7

Большое спасибо.

1 Ответ

0 голосов
/ 10 июля 2020

Для обоих примитивных операндов (int, double) и операндов класса оболочки (Integer, Double) будет применяться двоичное число c.

bnp(int,double)
bnp(Integer,Double)

JLS-15.25

Это означает, что, во-первых, для второго сценария происходит преобразование распаковки.

Integer -> int
Double -> double

Затем для обоих происходит расширяющееся примитивное преобразование, приводящее к a double

double
int -> double
double = expression ? double : double

JLS-5.6.2

, который может быть преобразован в дальнейшем в зависимости от переменной, которой вы присваиваете результат.

...