Scala 和 Spray 中的隐式值多态性
Implicit value polymorphism in Scala and Spray
我正在尝试为我的 Actors 创建一个共同特征以避免代码复制粘贴,基本上是这样的:
import akka.actor.Actor
import spray.json._
import scala.concurrent.Future
trait ActorResponsive[T] extends Actor {
import DefaultJsonProtocol._
import context.dispatcher
case class Response(success: Boolean,
single: Option[T] = None,
multiple: Option[Seq[T]] = None,
message: Option[String] = None)
implicit val responseFormat = jsonFormat4(Response)
def makeResponse(f: Future[Any]) =
f.map { /*...*/ }.recover { /*...*/ }
.map { case r => r.toJson.compactPrint }
}
无论其他代码缺陷如何,我都在努力使 responseFormat
多态解析,例如:
class PostgresItemActor extends ActorResponsive[Item] {
import com.blahblah.models.ItemJsonProtocol._
override def receive = makeResponse(someFuture)
}
...
class PostgresEventActor extends ActorResponsive[Event] {
import com.blahblah.models.EventJsonProtocol._
override def receive = makeResponse(someFuture)
}
因此每次调用 responseFormat
的 JsonProtocol 都将在 class 中解决导入问题,实现 ActorResponsive
特征。至于现在,我遇到了一个编译错误:
Cannot find JsonWriter or JsonFormat type class for ActorResponsive.this.Response
可能我在这里弄错了 OOP 的一些概念,但是是否可以为 T
解析 jsonFormat(Response)
或实现这样的行为?
您似乎需要提供 JsonWriter
作为 makeResponse
函数的参数。
大致如下:
def makeResponse[T: JsonWriter](f: Future[T]) =
f.map { /*...*/ }.recover { /*...*/ }
.map { case r => r.toJson.compactPrint }
我正在尝试为我的 Actors 创建一个共同特征以避免代码复制粘贴,基本上是这样的:
import akka.actor.Actor
import spray.json._
import scala.concurrent.Future
trait ActorResponsive[T] extends Actor {
import DefaultJsonProtocol._
import context.dispatcher
case class Response(success: Boolean,
single: Option[T] = None,
multiple: Option[Seq[T]] = None,
message: Option[String] = None)
implicit val responseFormat = jsonFormat4(Response)
def makeResponse(f: Future[Any]) =
f.map { /*...*/ }.recover { /*...*/ }
.map { case r => r.toJson.compactPrint }
}
无论其他代码缺陷如何,我都在努力使 responseFormat
多态解析,例如:
class PostgresItemActor extends ActorResponsive[Item] {
import com.blahblah.models.ItemJsonProtocol._
override def receive = makeResponse(someFuture)
}
...
class PostgresEventActor extends ActorResponsive[Event] {
import com.blahblah.models.EventJsonProtocol._
override def receive = makeResponse(someFuture)
}
因此每次调用 responseFormat
的 JsonProtocol 都将在 class 中解决导入问题,实现 ActorResponsive
特征。至于现在,我遇到了一个编译错误:
Cannot find JsonWriter or JsonFormat type class for ActorResponsive.this.Response
可能我在这里弄错了 OOP 的一些概念,但是是否可以为 T
解析 jsonFormat(Response)
或实现这样的行为?
您似乎需要提供 JsonWriter
作为 makeResponse
函数的参数。
大致如下:
def makeResponse[T: JsonWriter](f: Future[T]) =
f.map { /*...*/ }.recover { /*...*/ }
.map { case r => r.toJson.compactPrint }