集装箱类型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