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

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

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?

3 ответа

Решение

Да, четко определено, что 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 значение.

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

Тем не мение,

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

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

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

Другие вопросы по тегам