我在 Scala 中有这个课程:
object Util {
class Tapper[A](tapMe: A) {
def tap(f: A => Unit): A = {
f(tapMe)
tapMe
}
def tap(fs: (A => Unit)*): A = {
fs.foreach(_(tapMe))
tapMe
}
}
implicit def tapper[A](toTap: A): Tapper[A] = new Tapper(toTap)
}
现在,
"aaa".tap(_.trim)
不编译,报错
错误:缺少扩展函数的参数类型 ((x$1) => x$1.trim)
为什么类型不是推断为String
?从错误看来,隐式转换确实会触发(否则错误将类似于“tap
不是类的成员String
”)。似乎转换必须是 to Tapper[String]
,这意味着参数的类型是String => Unit
(或(String => Unit)*
)。
有趣的是,如果我注释掉任何一个tap
定义,它就会编译。