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

Условный оператор, странное поведение

public static void main(String[] args) {
    Object o1;
    if (true)
        o1 = new Integer(5);
    else
        o1 = new Double(2.0);

    Object o2 = true ? new Integer(5) : new Double(2.0);

    System.out.println(o1);
    System.out.println(o2);
}

В приведенном выше примере кода, используя условный оператор (?:), я могу переписать приведенный выше пример в одной строке. Итак, я думаю, результат o1 и o2 должен быть одинаковым. Но, как ни странно, результат:

5
5.0

Не могли бы вы, ребята, помочь мне указать, почему это поведение?

ОБНОВЛЕНО: Результат будет таким же, как в следующем коде:

Object o2 = true ? (Object) new Integer(5) : new Double(2.0);
4b9b3361

Ответ 1

Это, по-видимому, является побочным эффектом Autoboxing.? оператор пытается определить, который является базовым типом, который может быть применен к объекту. Он видит Double справа и Integer, который также может быть автобоксирован на Double.

Может быть, это так, потому что Integer может быть помечен в Double, но Double не может быть помечен в Integer?

Обратите внимание, что это дает тот же результат...

Object o2 = true ? 5 : new Double(2.0);