【发布时间】:2018-04-19 10:01:22
【问题描述】:
鉴于通过 json4s 解析的 scala http 客户端,我有以下工作代码将 HttpResponse 的 Future 转换为案例类的 Future:
def getJobIds(): Future[Seq[Job]] = {
...
var req = HttpRequest(
method = HttpMethods.GET,
uri = uri
)
val res: Future[HttpResponse] = Http().singleRequest(req)
res.flatMap {
case response@HttpResponse(StatusCodes.OK, _, _, _) => {
val buffer = ByteString("")
response.entity.dataBytes
.runFold(buffer)(_ ++ _)
.map(_.utf8String)
.map(
(body: String) => {
parse(body).as[Seq[Job]]
}
)
}
case _: Any => throw new Throwable("Error!")
}
}
现在我想提取逻辑以使用泛型将 HttpResponse 转换为案例类,以免在其他调用中重复自己:
def getJobIds(): Future[Seq[Job]] = {
...
val res: Future[HttpResponse] = Http().singleRequest(req)
transformResponse[Seq[Job]](res)
}
private def transformResponse[T](r: Future[HttpResponse]): Future[T] = {
r.flatMap {
case response@HttpResponse(StatusCodes.OK, _, _, _) => {
val buffer = ByteString("")
response.entity.dataBytes
.runFold(buffer)(_ ++ _)
.map(_.utf8String)
.map(parse(_).extract[T])
}
case _: Any => throw new Throwable("Error!")
}
}
然而现在抛出:
Metronome.scala:46:32: No Manifest available for T
换行
.map(parse(_).extract[T])
如何使用泛型使代码工作?
【问题讨论】:
标签: scala generics generic-programming json4s