Упаковщики и авто-бокс

Существует следующий код:

Integer time = 12;
Double lateTime = 12.30;
Boolean late = false;
Double result = late ? lateTime : time;  //Why here can I assign an Integer to a Double?
System.out.println(result);

Он печатает:

12.0

Этот компилятор не компилируется. Почему?

Integer time = 12;
Double lateTime = 12.30;
Double result = time;      //Integer cannot be converted to Double
System.out.println(result);

Ответ 1

Различия обусловлены действием тройного оператора в Java.


Тройной условный случай:

В выражении late ? lateTime : time Java автоматически отключит один из аргументов (в соответствии со значением late) до соответствующего примитивного типа. (Вы можете наблюдать это, установив time в null и late в true: a NullPointerException не выбрасывается. То же самое применяется при настройке lastTime на null и late на false.)

Если значение выражения будет time, то оно будет расширено до a double.

В любом случае полученный double автоматически помещается в double, назначая его result.


Простой случай назначения:

При написании Double result = time; Java запрещает это, так как ожидает, что вы будете более явным.


Лично я считаю, что механизм тройного условного оператора Java по отношению к бокс-примитивным типам является одной из самых пагубных частей языка.