6.26.3 Разрешение перегрузки
Сначала определяется набор потенциально применимых функций на основе формы аргументов
...
Если в B есть только одна альтернатива, эта альтернатива выбирается.
В противном случае, пусть S1,.,,Sm - вектор типов, полученный путем ввода каждого аргумента с неопределенным ожидаемым типом.
Потенциально применимы обе перегрузки tap
(основанные на «форме» аргументов, которая учитываетконструкторы arity и type FunctionN).
Таким образом, типер работает так же, как и при:
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)
}