簡體   English   中英

容器類型的類型類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM