Эта функция вызывает сама себя или вызывает перегрузку?
Рассмотрим две перегрузки:
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)
,