2015-12-15 11 views
1

Я пытаюсь создать общую черту для моих актеров, чтобы избежать кода copypasting, в основном, как это:неявного значения полиморфизм в Scala и спрейте

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) 
} 

Так JsonProtocol каждый раз responseFormat называются будет решено в отношении импорта в классе, реализуя ActorResponsive черты. На данный момент, я получаю ошибку компиляции:

Cannot find JsonWriter or JsonFormat type class for ActorResponsive.this.Response 

Вероятно, я получаю некоторые концепции объектно-ориентированного программирования здесь не так, но это можно решить jsonFormat(Response) для T или достичь какой-то поведение, как это?

ответ

1

Похоже, что вам необходимо предоставить JsonWriter в качестве параметра вашей функции makeResponse.

Что-то вдоль линий:

def makeResponse[T: JsonWriter](f: Future[T]) = 
    f.map { /*...*/ }.recover { /*...*/ } 
    .map { case r => r.toJson.compactPrint } 
+0

Спасибо, что мне удалось сделать это с помощью такой функции: определение функции makeResponse (е: Future [Любой]) (неявный автор: spray.json. JsonWriter [Response [T]], исполнитель: scala.concurrent.ExecutionContext) = ... ' – infm