[英]Type class for container type
I want to build an interface that doesn't have any dependencies, only scala library 我想构建一个没有任何依赖关系的接口,只有scala库
Let's imagine this is what i want: 让我们想象这就是我想要的:
iface.jar iface.jar
trait jsonIface[JsValue] {
def turnJsonIntoClass[T](t: JsValue)
}
As you see it doesn't contains any imports. 如您所见,它不包含任何导入。
Let's go to implementation: 让我们去实现:
iface_implementation1.jar iface_implementation1.jar
import play.api.libs.json._
trait myPlayJsonImpl extends jsonIface[JsValue] {
def turnJsonIntoClass[T](t: JsValue) { t.as[T] }
}
But this wouldn't compile because as[T] needs implicit Reads[T] 但这不会编译,因为as [T]需要隐式读取[T]
So i rewrote my iface like that: 所以我像这样重写了我的iface:
trait jsonIface[JsValue] {
type metaInfo[T]
def turnJsonIntoClass[T](t: JsValue)(implicit meta: metaInfo[T])
}
and play json impl looks like that: 并播放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] }
}
and json4s looks like that: 和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] }
}
This compiles but it looks cumbersome 这可以编译,但是看起来很麻烦
Normally when you start to work with type-class traits you continue to do so rather than work with OOP traits: 通常,当您开始使用类型类特征时,您会继续这样做,而不是使用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]
}
}
or 要么
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.