Ответ 1
Да, он четко определил, что он вызовет перегрузку Double
. Он не мог вызвать перегрузку Integer
, потому что нет неявного преобразования из Double
(который является типом условного выражения) в Integer
.
В принципе, есть две части этого, которые не имеют значения:
- Что метод вызывается из перегрузки
- Что аргумент метода является условным выражением
Итак, если вы думаете об этом как:
Double d = getSomeDoubleValueFromAnywhere();
add(d);
... какой метод вы ожидаете назвать? Предположительно, метод add(Double)
- так, что вы также вызываете в своей ситуации.
Сложная часть разрабатывает тип условного выражения - это Double
или Double
? Я считаю, что правила (которые трудно понять, IMO) означают, что он Double
, из-за использования литерала null
который имеет тип null
). Если бы у вас было:
Double dv = null;
add(value == null ? dv : value.doubleValue());
... тогда тип условного выражения будет Double
, и вы получите NullPointerException
, если value
были когда-либо null
, потому что он попытался бы распаковать значение null
.