我想定义一个重载方法,一个方法接受一个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