Stream
私は、spray.json を使用してケース クラスを json 表現に変換することにより、応答をストリーミングするコードをいくつか持っています。これは、単一のケース クラスでは問題なく機能しますが、一般化したいと考えています。
だから私はこのようなケースクラスから始めています:
import spray.json._
import spray.json.DefaultJsonProtocol._
case class Item(foo: String, bar: Int)
case class Report(baz: String, stream: Stream[Item])
object Protocol { implicit val ItemFormat = jsonFormat2(Item) }
私のレポートストリーミングメソッドには、次のようなコードがあります(非常に単純化されています):
def streamReport(...) {
import Protocol._
val handler: PartialFunction[Try[Any], String] = {
case Success(Report(_, stream)) =>
stream.head.toJson.compactPrint
}
}
私がやりたいことはReport
、アイテム以上をサポートするために一般化することです:
case class Report[T](baz: String, stream: Stream[T])
しかし、もちろん、streamReport
メソッドはJsonWriter
type のスコープ内にa を見つけることができませんAny
。
にコンテキストがバインドされた型パラメーターを追加し、直接streamReport
渡すと、必要に近いことができます。Report
def jsonStream[T : JsonWriter](report: Report[T]): String =
implicitly[JsonWriter[T]].write(report.stream.head).compactPrint
ただし、これを で動作させる方法がわかりませんPartialFunction
。以下はコンパイルされません (また、部分関数のシグネチャが上記とは異なるため、正確には適合しません):
def handler[T : JsonWriter](): PartialFunction[T, String] = {
case Success(Report(_, stream)) =>
implicitly[JsonWriter[T]].write(report.stream.head).compactPrint
}
どこが間違っているのかわかりません。型の消去、またはTry[Any]
部分関数のパラメーター型としての問題に関係していますか? ストリームの要素タイプに必要な暗黙的な JsonWriter を取得するにはどうすればよいですか?