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

标签 scala implicit-conversion implicit

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

我有一个类 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
}

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

附注:我无法更改某些方法

最佳答案

它无法工作,因为您没有隐式 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/

相关文章:

java - Akka 对向远程参与者发送大量消息的警告

scala sbt 测试在多个项目上运行一次设置和清理命令

c - 整数转换(缩小,扩大),未定义的行为

c++ - 关于构造函数匹配和隐式转换的问题

scala - 解析 `Show` 类型类实例的隐式

Scala Play 2.1.0 - Assets 没有出现在 Heroku 上?

scala - if isEmpty 问题

swift - Swift 的 int literal to float 推理是如何工作的?

scala - scala 中意外的隐式解析

Scala:哪个隐式参数优先?定义方法时声明的那个?或者该方法在哪里被调用?