Подтвердить что ты не робот

Неверный тип в условном назначении Java

В следующем коде у меня две идентичные операции условного присваивания, один возвращает объект типа Double, а второй возвращает строку "Integer".

double d = 24.0;

Number o = (d % 1 == 0) ? new Double(d).intValue() : new Double(d).doubleValue();
String result = (d % 1 == 0) ? "Integer" : "Double";

System.out.println(o.getClass()); // prints "class java.lang.Double"
System.out.println(result); // Integer

Почему одни и те же выражения возвращают две разные вещи?

4b9b3361

Ответ 1

Ну, это из-за спецификаций JLS для условного оператора:

В противном случае, если второй и третий операнды имеют типы, которые являются конвертируемыми (п. 5.1.8), к числовым типам, то есть несколько случаев:

  • ...
  • В противном случае двоичная цифровая реклама (§5.6.2) применяется к типам операндов, а тип условного выражения - это продвинутый тип второго и третьи операнды.

Числовое продвижение определяется здесь в §5.6.2. В нем говорится:

Расширение примитивного преобразования (§5.1.2) применяется для преобразования либо или оба операнда, как указано в следующих правилах:

  • Если один из операндов имеет тип double, другой преобразуется в double.
  • ...