[英]Type class for container type
我想構建一個沒有任何依賴關系的接口,只有scala庫
讓我們想象這就是我想要的:
iface.jar
trait jsonIface[JsValue] {
def turnJsonIntoClass[T](t: JsValue)
}
如您所見,它不包含任何導入。
讓我們去實現:
iface_implementation1.jar
import play.api.libs.json._
trait myPlayJsonImpl extends jsonIface[JsValue] {
def turnJsonIntoClass[T](t: JsValue) { t.as[T] }
}
但這不會編譯,因為as [T]需要隱式讀取[T]
所以我像這樣重寫了我的iface:
trait jsonIface[JsValue] {
type metaInfo[T]
def turnJsonIntoClass[T](t: JsValue)(implicit meta: metaInfo[T])
}
並播放json impl如下所示:
import play.api.libs.json._
trait myPlayJsonImpl extends jsonIface[JsValue] {
type conv[M] = Reads[M]
def turnJsonIntoClass[T](t: JsValue)(implicit reads: Reads[T]) { t.as[T] }
}
和json4s看起來像這樣:
import org.json4s.JsonAST._
trait json4sImpl extends jsonIface[JValue] {
type conv[M] = Manifest[M]
def turnJsonIntoClass[T](t: JsValue)(implicit reads: Manifest[T]) { t.extract[T] }
}
這可以編譯,但是看起來很麻煩
通常,當您開始使用類型類特征時,您會繼續這樣做,而不是使用OOP特征:
import org.json4s.Formats
import org.json4s.JsonAST.JValue
import play.api.libs.json.{JsValue, Reads}
trait jsonIface[JsValue, T] {
def turnJsonIntoClass(t: JsValue): T
}
object jsonIface {
implicit def json4sImpl[T](implicit formats: Formats, manifest: Manifest[T]): jsonIface[JValue, T] = new jsonIface[JValue, T] {
def turnJsonIntoClass(t: JValue): T = t.extract[T]
}
implicit def myPlayJsonImpl[T](implicit reads: Reads[T]): jsonIface[JsValue, T] = new jsonIface[JsValue, T] {
def turnJsonIntoClass(t: JsValue): T = t.as[T]
}
}
要么
object jsonIface {
implicit def json4sImpl[T](implicit formats: Formats, manifest: Manifest[T]): jsonIface[JValue, T] = (t: JValue) => t.extract[T]
implicit def myPlayJsonImpl[T](implicit reads: Reads[T]): jsonIface[JsValue, T] = (t: JsValue) => t.as[T]
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.