模糊的隐式转换错误

时间:2012-07-29 05:47:08

标签: scala implicit-conversion

以下是一段代码片段,尝试重现我在实施内部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
                        ^

然而,评论其中一个含义并不能解决问题。我正在使用视图边界,因为最后我想链接implicits。请注意,上面给出的代码段不涉及隐式链接。

我希望foo1隐式转换适用于第一个test应用,而foo2隐式转换适用于第二个test应用。 我不明白这两个含义如何适用于test函数应用程序。为什么会发生这种情况以及如何使其发挥作用?

修改: 如果我不使用视图边界,它可以正常工作,如下所示。但是我想使用视图边界,因为我想在帖子How can I chain implicits in 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

1 个答案:

答案 0 :(得分:0)

我担心这不起作用。在解决implicits时不会考虑视图边界,因此您无法链接implicits。这是设计,因为这样的链接可能会创建一些非常难以理解的代码。我看到的唯一选择是为每个可能的转换链创建一个新的隐式转换。