2015-05-29 47 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

相關問題