我想定义一个重载方法,一个方法接受一个function0,另一个方法接受一个function1,即:

def produces(f: Context => Any): Processor = ...

def produces(thunk: => Any): Processor = ...

这样编译就好了,因为第一个编译为使用Function1,第二个编译为使用Function0,但是在我要调用时会出现问题,因此:
produces {
 ctx => "hello"
}

给我一个

缺少参数类型

只有一个参数接受输入,所以为什么不能推断。

关于如何解决此问题的任何提示(除了重命名方法之一:))

最佳答案

这看起来很傻,但是您可以(笨拙地)通过要求对按名称命名的I-can-take-anything版本进行隐式转换来帮助编译器的搜索策略:

object Test {
  implicit def low_priority_conversion(t: Test.type) = LowPriority
  object LowPriority {
    def produces(x: => Any) : Boolean = false
  }
  def produces(f: String => Any): Boolean = true
}

无论您是否使用import Test._,您都会发现自己的行为正确:
scala> Test.produces("fish")
res0: Boolean = false

scala> Test.produces(_.length)
res1: Boolean = true

scala> import Test._
import Test._

scala> produces("fish")
res2: Boolean = false

scala> produces(_.length)
res3: Boolean = true

10-04 13:40