首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala:隐式转换类型为方法的隐式param

Scala:隐式转换类型为方法的隐式param
EN

Stack Overflow用户
提问于 2017-09-15 09:39:39
回答 1查看 503关注 0票数 4

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

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

如果我将MyClass的对象传递给显式期望String的方法,那么它工作得很好。

但是,隐式地传递它会导致编译错误:

代码语言:javascript
复制
could not find implicit value for parameter str: String someMethod()

以下是代码:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2017-09-15 10:03:52

它不能工作,因为您没有隐式字符串值。您所拥有的是来自MyClass => String的隐式转换,而不是字符串本身。

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

代码语言:javascript
复制
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类型,它仍然可以通过显式提供参数来工作:

代码语言:javascript
复制
implicit val myClass: MyClass = MyClass("Hello")
someMethod(myClass)

所以是的,什么起作用和什么不起作用之间的界限似乎有点武断。我不确定它是由使其工作所需的大量编译器黑客造成的,还是他们只是想防止在执行这种递归隐式搜索时出现混乱。可能是后者。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46236482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档