我有一个方法需要一些字符串类型的隐式参数。
我有一个 MyClass
类的对象,我想隐式传递给该方法。
首先,我进行了从 MyClass
到 String
的隐式转换。
如果我将 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
最佳答案
它无法工作,因为您没有隐式 String 值。您所拥有的是 MyClass => 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)
所以,是的,有效和有效之间的界限似乎有点武断。我不确定它是否是由使其工作所需的编译器黑客数量引起的,或者他们只是想防止在进行这种递归隐式搜索时出现困惑。大概是后者。
关于Scala:隐式转换类型作为方法的隐式参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46236482/