2015-05-29 50 views
1

这是工作示例:为什么我们需要明确地在地图上使用隐式方法?

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编写隐式方法?例如: -

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 
... 

回答

0

case (k,v) => (k,v)你没有指定,此案的结果应该比(字符串,字符串)以外的任何其他行。要强制隐式转换,您可以编写:

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

是否可以从“JsObject”的构造函数中推断它?我想彻底删除'mapString2JsObject'方法并只使用'map2JsObject'。是否有可能不依赖像隐式def mapString2JsObject(m:Map [String,String]):JsObject'然后隐式def mapStringString2JsObject(m:Map [String,Map [String,String]]):JsObject'等等... ? – mirelon

+0

我编辑了这个问题,以便更清楚我在问什么 – mirelon

+0

这听起来像你所需要的是一个隐式转换,如:隐式def mapStringMap2JsValueMap(m:Map [String,String]):Map [String,JsValue] = m .map {case(k,v)=>(k,v:JsValue)}' – Shadowlands

相关问题