Martin 在 《Programming in Scala Third Edition》 中講解隱式轉(zhuǎn)換時提到,隱式參數(shù)或隱式轉(zhuǎn)換可能來自于當前作用域,或是源類型、目標類型的伴生對象。其實真相并不是那么簡單,Martin 沒有更深入講解更多的來源。這些額外的隱式轉(zhuǎn)換來源對庫開發(fā)者來說非常贊,可以為開發(fā)者帶來更簡潔的開發(fā)體驗。例如我們在 Play 里經(jīng)常像下面這樣構(gòu)建一個 JsObject :
import java.time.Instant
import play.api.libs.json.Json
object Test extends App {
println(Json.obj("time" -> Instant.now()))
}
//輸出: {"time":"2018-05-25T18:13:23.409Z"}
但是我們發(fā)現(xiàn)Json.obj() 方法簽名如下:
def obj(fields: (String, JsValueWrapper)*): JsObject
我們并沒有導(dǎo)入任何的隱式轉(zhuǎn)換,到底是什么神奇的力量將 Instant.now() 轉(zhuǎn)換成了 JsValueWrapper ? 其實原因很簡單,隱式轉(zhuǎn)換有一個來源是目標類型的父對象成員。JsValueWrapper 的父對象是 Json ,Json 對象定義了如下隱式轉(zhuǎn)換:
implicit def toJsFieldJsValueWrapper[T](field: T)(implicit w: Writes[T]): JsValueWrapper = JsValueWrapperImpl(w.writes(field))
更多的隱式轉(zhuǎn)換來源請參考官方的總結(jié)的隱式轉(zhuǎn)換圣典。
轉(zhuǎn)載請注明來自 PlayScala社區(qū)[http://www.playscala.cn]