为什么我们需要在map值上显式使用隐式方法?

时间:2015-05-29 14:30:36

标签: json scala implicit-conversion implicit spray

这是工作示例:

import spray.json._

trait JsonSupport {

  implicit def string2JsValue(s: String): JsValue = {
    JsString(s)
  }

  implicit def map2JsObject(m: Map[String, JsValue]): JsObject = {
    JsObject(m)
  }

  implicit def mapString2JsObject(m: Map[String, String]): JsObject = {
    JsObject(m.map {
      case (k,v) => (k,string2JsValue(v))
    })
  }

}

现在看来,它正在发挥作用。但如果我更换

implicit def mapString2JsObject(m: Map[String, String]): JsObject = {
  JsObject(m.map {
    case (k,v) => (k,string2JsValue(v))
  })
}

implicit def mapString2JsObject(m: Map[String, String]): JsObject = {
  JsObject(m)
}

然后发生以下错误:

预期:Map[String, JsValue],实际:Map[String, String]

为什么隐式方法没有完成它的工作,我需要隐式调用它?

是否可以以某种方式使用implicits,以便不需要为Map的每个可能嵌套编写隐式方法? E.g:

implicit def map1String2JsObject(m: Map[String, String]): JsObject
implicit def map2String2JsObject(m: Map[String, Map[String, String]]): JsObject
implicit def map3String2JsObject(m: Map[String, Map[String, Map[String, String]]]): JsObject
...

1 个答案:

答案 0 :(得分:0)

在行case (k,v) => (k,v)中,您还没有指定案例的结果应该是除(String,String)之外的任何内容。要强制进行隐式转换,您可以写:

case (k,v) => (k,v:JsValue)