我有一个方法,需要一些类型为String的隐式参数。
我有一个类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.:I不能改变someMethod
发布于 2017-09-15 10:03:52
它不能工作,因为您没有隐式字符串值。您所拥有的是来自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行,您可以传递一个隐式字符串。
注意,如果保持MyClass类型,它仍然可以通过显式提供参数来工作:
implicit val myClass: MyClass = MyClass("Hello")
someMethod(myClass)所以是的,什么起作用和什么不起作用之间的界限似乎有点武断。我不确定它是由使其工作所需的大量编译器黑客造成的,还是他们只是想防止在执行这种递归隐式搜索时出现混乱。可能是后者。
https://stackoverflow.com/questions/46236482
复制相似问题