關於 Scala 隱式轉換必讀的一篇官方聖典 頂 原 薦

Martin 在 《Programming in Scala Third Edition》 中講解隱式轉換時提到,隱式參數或隱式轉換可能來自於當前作用域,或是源類型、目標類型的伴生對象。其實真相並不是那麼簡單,Martin 沒有更深入講解更多的來源。這些額外的隱式轉換來源對庫開發者來說非常贊,可以爲開發者帶來更簡潔的開發體驗。例如我們在 Play 裏經常像下面這樣構建一個 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"}

但是我們發現Json.obj() 方法簽名如下:

def obj(fields: (String, JsValueWrapper)*): JsObject

我們並沒有導入任何的隱式轉換,到底是什麼神奇的力量將 Instant.now() 轉換成了 JsValueWrapper ? 其實原因很簡單,隱式轉換有一個來源是目標類型的父對象成員。JsValueWrapper 的父對象是 Json ,Json 對象定義瞭如下隱式轉換:

implicit def toJsFieldJsValueWrapper[T](field: T)(implicit w: Writes[T]): JsValueWrapper = JsValueWrapperImpl(w.writes(field))

更多的隱式轉換來源請參考官方的總結的隱式轉換聖典

轉載請註明作者 joymufeng 。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章