При использовании в ситуации, когда ожидается функция, Scala «поднимет» метод до FunctionN [T1, ..., R].
В этой ситуации, так как множественный принимает 2 параметра, он эффективно поднимается как:
(1 to 10).map(new Function2[Int,Int,Int]{ def apply(v1: Int, v2: Int) = multiple(v1, v2) })
Даже если исходный метод имеет аргумент по умолчанию, объекты FunctionN - нет. Ошибка типа теперь должна быть понятна здесь. Когда используется множественное число (_), это вызов множественного числа с одним аргументом со вторым значением по умолчанию, поэтому он обрабатывается следующим образом:
(1 to 10).map(new Function1[Int,Int]{ def apply(v1: Int) = multiple(v1) })
Этот тип проверяет нормально, как показали другие.
Обратите внимание, что (несколько _) не совпадает с несколькими (_). Первый представляет множественное число со всеми аргументами, помеченными подстановочными символами, и поэтому является Function2, в то время как последний применяет множественное число к одному аргументу с подстановочными знаками, в результате чего другой аргумент будет установлен по умолчанию в этой точке , как и Function1. .
Значения по умолчанию применяются во время компиляции путем введения нового метода, который возвращает значение по умолчанию. Если вызывается метод по умолчанию, если аргументы отсутствуют, компилятор добавит необходимые вызовы к дополнительным методам для параметров по умолчанию перед добавлением вызова к самому методу. Это означает, что сам метод компилируется в код, который сам не знает параметров по умолчанию. Чтобы увидеть это, скомпилируйте следующий пример класса:
class Defaults {
def m(a: Int, b: Int = 3) = a * b
def a = m(1)
def b = m(1, 2)
}
затем запустите: javap -c По умолчанию