2015-05-29 1 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) вы не указали, что в результате этого дела должно быть ничего, кроме (String, String). Чтобы заставить неявное преобразование, вы можете написать:

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

Можно ли вывести его из конструктора 'JsObject'? Я хотел бы полностью удалить метод «mapString2JsObject» и использовать только «map2JsObject». Можно ли не полагаться на такие методы, как 'implicit def mapString2JsObject (m: Map [String, String]): JsObject', а затем' implicit def mapStringString2JsObject (m: Map [String, Map [String, String]]): JsObject' и так далее... ? – mirelon

+0

Я отредактировал вопрос, чтобы уточнить, что я прошу – mirelon

+0

Это похоже на то, что вам нужно, - это неявное преобразование вроде: 'implicit def mapStringMap2JsValueMap (m: Map [String, String]): Map [String, JsValue] = m .map {case (k, v) => (k, v: JsValue)} ' – Shadowlands