集装箱类型Type类

我想建立一个没有任何相关性的接口,只有Scala库集装箱类型Type类

让我们想象一下,这是我想要的东西:

iface.jar

​​

如您所见,它不包含任何导入。

让我们去实现:

iface_implementation1.jar

import play.api.libs.json._ 

trait myPlayJsonImpl extends jsonIface[JsValue] {

def turnJsonIntoClass[T](t: JsValue) { t.as[T] }

}

但是这不会编译,因为作为[T]需要隐读[T]

所以我改写了我的iface like that:

trait jsonIface[JsValue] { 

type metaInfo[T]

def turnJsonIntoClass[T](t: JsValue)(implicit meta: metaInfo[T])

}

玩JSON实现了一套看起来像这样:

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]

}

以上是 集装箱类型Type类 的全部内容, 来源链接: utcz.com/qa/258303.html

回到顶部