關(guān)于 Scala 隱式轉(zhuǎn)換必讀的一篇官方圣典

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]

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容