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

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

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?

12 голосов | спросил Fitzwilliam Bennet-Darcy 19 PMpWed, 19 Apr 2017 18:31:14 +030031Wednesday 2017, 18:31:14

3 ответа


0

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

ответил Jon Skeet 19 PMpWed, 19 Apr 2017 18:35:29 +030035Wednesday 2017, 18:35:29
0

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

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

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

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

ответил Andremoniy 19 PMpWed, 19 Apr 2017 18:36:50 +030036Wednesday 2017, 18:36:50
0

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

ответил Cardinal System 19 PMpWed, 19 Apr 2017 18:35:47 +030035Wednesday 2017, 18:35:47

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132