我在 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
类的成员")。而且似乎转换必须是Tapper[String]
类型,这意味着参数的类型是String => Unit
(或(String => Unit)*
)。
有趣的是,如果我注释掉任意一个tap
定义,那么它就可以编译通过。