这是一个代码片段,它试图重现我在实现内部 DSL 时遇到的问题:
object testObj {
implicit def foo1[T <% Function1[Int, Int]](fun: T): String = "foo1"
implicit def foo2[T <% Function2[Int, Int, Int]](fun: T): String = "foo2"
def test(arg: String): Unit = {}
test((x:Int) => 5) //Ambiguous implicit conversion error
test((x:Int, y:Int) => 5) //Ambiguous implicit conversion error
}
我在显示的位置收到模棱两可的隐式转换错误:
<console>:21: error: type mismatch;
found : Int => Int
required: String
Note that implicit conversions are not applicable because they are ambiguous:
both method foo1 in object testObj of type [T](fun: T)(implicit evidence$1: T => (Int => Int))String
and method foo2 in object testObj of type [T](fun: T)(implicit evidence$2: T => ((Int, Int) => Int))String
are possible conversion functions from Int => Int to String
test((x:Int) => 5) //Ambiguous implicit conversion error
^
然而,评论其中一个隐含并不能解决问题。我正在使用视图边界,因为最后我想链接隐式。请注意,上面给出的代码片段不涉及隐式链接。
我期望foo1
隐式转换适用于第一个test
应用程序,而foo2
隐式转换适用于第二个test
应用程序。我不明白这两个隐式如何适用于两个test
功能应用程序。为什么会发生这种情况以及如何使其发挥作用?
编辑:如果我不使用视图边界,它可以正常工作,如下所示。但是我想使用视图边界,因为我想按照帖子中解释的方式 链接隐式如何在 Scala 中链接隐式?.
implicit def foo1(fun: Function1[Int, Int]): String = "foo1"
implicit def foo2(fun: Function2[Int, Int, Int]): String = "foo2"
def test(arg: String): Unit = {}
test((x:Int) => 5) //No error
test((x:Int, y:Int) => 5) //No error