Scala:隐式转换类型作为方法的隐式参数

时间:2017-09-15 09:39:40

标签: scala implicit-conversion implicit

我有一个方法需要一些String类型的隐式参数。

我有一个类MyClass的对象,我想隐式地传递给该方法。 首先,我正在进行从MyClassString的隐式转换。

如果我将MyClass的对象明确地传递给期望String的方法,那么它可以正常工作。

但隐式传递会导致编译错误:

could not find implicit value for parameter str: String someMethod()

以下是代码:

case class MyClass(str: String)
object MyClass {
  implicit def myClassToString(myClass: MyClass): String = myClass.str
}

object Application extends App {
  def someMethod()(implicit str: String) = println(str)
  implicit val myClass = MyClass("Hello")
  someMethod()(myClass) <-- WORKS
  someMethod() <-- ERROR
}

是否可以隐式传递隐式转换的变量?

P.S。:我无法更改someMethod

1 个答案:

答案 0 :(得分:3)

它无法工作,因为您没有隐式字符串值。你所拥有的是MyClass => String的隐式转换,但不是字符串本身。

所以你需要的是提供一个String。由于你有从MyClass到String的隐式转换,你可以说:

def someMethod()(implicit str: String) = println(str)
implicit val myClass: String = MyClass("Hello") // conversion kicks in
someMethod() // error: no implicit string found in scope

这种方式在第2行中隐式转换开始,所以第3行你有一个准备传入的隐式String。

请注意,如果保留MyClass类型,它仍然可以通过显式提供参数来工作:

implicit val myClass: MyClass = MyClass("Hello")
someMethod(myClass)

所以是的,有效的和不可的之间的界限似乎有点武断。我不确定它是否由使其工作所需的编译器黑客数量引起,或者他们只是想在进行这种递归隐式搜索时防止混乱。可能是后者。