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 }