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

Вызывает ли эта функция сам вызов или вызывает перегрузку?

Рассмотрим две перегрузки:

public void add(Integer value)
{
    add(value == null ? null : value.doubleValue());        
}

и

public void add(Double value)
{
    // some code here
}

Если я вызываю первый экземпляр null Integer, то тернарный условный вызов перегружает до Double или он сам вызывает?

На моей машине он вызывает перегрузку Double, но является ли эта четко определенная Java? И что говорит JLS об этом?

4b9b3361

Ответ 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.

Ответ 2

Я почти уверен, что такого вопроса уже задали здесь, но он не может его найти.

В любом случае,

add(value == null ? null : value.doubleValue()); вызывает add(Double value), это очень легко проверить, пытаясь скомпилировать код без второго метода и в отладчике.

Относительно того, что JLS говорит об этом: тип выражения value == null ? null : value.doubleValue(), очевидно, Double, как описано здесь.

Ответ 3

Поскольку вы используете .doubleValue(), даже если это целое число, оно все равно преобразуется в double. Таким образом, вызывается перегрузка public void add(Double value).