Scala隐式转换隐式参数

时间:2016-02-13 15:25:27

标签: scala implicit

我正在尝试编写一些代码来转换隐式参数,如下所示:

case class A()
case class B()
object B {
    implicit def b2a(b: B): A = new A()
}

def foo(f: B => String) = f(new B())
def bar(implicit a: A) = "A"

foo { implicit b =>
  bar()
}

给出错误:

<console>:27: error: not enough arguments for method bar: (implicit a: A)String. 
Unspecified value parameter a.

有没有办法在不调用手动转换的情况下使用隐式转换?

1 个答案:

答案 0 :(得分:2)

我相信这会一次打破一个&#34;规则。您对A的调用范围内没有隐式bar,只有隐式B。如果编译器试图隐式地将隐式B转换为A,那将是两步而不是一步。

但是,您可以通过隐式链接解决此问题。

implicit def a(implicit b: B): A = new A()

如果此方法在范围内,编译器将在范围内看到隐式A,只要它可以填充隐式B,它就可以。

scala> foo { implicit b => bar }
res1: String = A

您遇到的具体错误是因为您需要删除我在此处执行的括号。这导致&#34;隐含未找到&#34;错误,如上所述。