Ответ 1
6.26.3 Разрешение перегрузки
Сначала определяется множество функции, потенциально применимых в зависимости от формы Аргументы
...
Если есть ровно одна альтернатива в B, эта альтернатива выбрана.
В противном случае пусть S1,.,, Sm - вектор типов, полученных путем набора текста каждый аргумент с undefinedожидаемый тип.
Обе перегрузки tap
потенциально применимы (на основе "формы" аргументов, в которой учитываются конструкторы arty и type FunctionN).
Таким образом, typer работает так же, как и с:
val x = _.trim
и не работает.
Более разумный алгоритм может принимать наименьшую верхнюю границу соответствующего типа параметра для каждой альтернативы и использовать его как ожидаемый тип. Но эта сложность на самом деле не стоит того, ИМО. В перегрузке много угловых случаев, это лишь другое.
Но есть трюк, который вы можете использовать в этом случае, если вам действительно нужна перегрузка, которая принимает один параметр:
object Util {
class Tapper[A](tapMe: A) {
def tap(f: A => Unit): A = {
f(tapMe)
tapMe
}
def tap(f0: A => Unit, f1: A => Unit, fs: (A => Unit)*): A = {
(Seq(f0, f1) ++ fs).foreach(_(tapMe))
tapMe
}
}
implicit def tapper[A](toTap: A): Tapper[A] = new Tapper(toTap)
"".tap(_.toString)
"".tap(_.toString, _.toString)
"".tap(_.toString, _.toString, _.toString)
}