gpt4 book ai didi

Scala 类型类模式和泛型方法

转载 作者:行者123 更新时间:2023-12-01 04:01:14 25 4
gpt4 key购买 nike

我正在尝试编写一个通用提取器,用于使用spray 和spray-json 解析json POST 正文。

但是,我正在努力让它与多个模型一起工作。这是服务对象中的 case 语句:

import MyJsonProtocol._

...

def receive = {
case Post (Routes.person.post, p: Person) => sender ! Ok(Actions.person.post(p))
case Get (Routes.foo.forId(x)) => sender ! Ok(x)
case _ => sender ! Ok("No handler")
}

这是我编写的提取器(只要在 case 语句的范围内只有一个模型的 JsonReader 就可以工作):
//NB. Json.parse returns an Option[T]
object Post extends Request {
def unapply[T:JsonReader](req: HttpRequest): Option[(String, T)] = req match {
case HttpRequest(POST, url, _, HttpBody(_, body), _) => Json.parse[T](body.asString).map((url, _))
case _ => None
}
}

但是,一旦我添加一个新模型(和关联的 JsonReader),代码就不再编译并出现此错误:
ambiguous implicit values:
[error] both value personFormat in object Json of type => spray.json.RootJsonFormat[com.rsslldnphy.foam.models.Person]
[error] and value animalFormat in object Json of type => spray.json.RootJsonFormat[com.rsslldnphy.foam.models.Animal]
[error] match expected type spray.json.JsonReader[T]
[error] case Post (Routes.person.post, p: Person) => sender ! Ok(Actions.person.post(p))

JsonReaders 的泛型类型不同的事实似乎丢失了。这是类型删除吗?有没有办法绕过它来获得我想要的东西?

这是迄今为止该项目的完整编译代码,并在 ExampleService 中有注释。这解释了是什么让它崩溃了: github.com/rsslldnphy/foam .感谢您的帮助,谢谢。

或者,如果我想要的目前不可能,有人可以提出替代方法吗?

最佳答案

你需要给编译器明确的指令来完成这项工作。正如您在下面看到的,编译器无法推断 T 应该是什么。编译器需要能够从请求中动态查看 Json 并从中暗示一种类型(我们只能梦想它这样做;))

def unapply[T:JsonReader](req: HttpRequest): Option[(String, T)] = (...) Json.parse[T] (...)

这意味着要完成这项工作,您必须明确注释帖子,如下所示:
import MyJsonProtocol._

...

def receive = {
case Post[Person] (Routes.person.post, p: Person) => sender ! Ok(Actions.person.post(p))
case Get (Routes.foo.forId(x)) => sender ! Ok(x)
case _ => sender ! Ok("No handler")
}

并将定义更改为此
case class Post[T: JsonReader] extends Request {
def unapply(req: HttpRequest): Option[(String, T)] = req match {
case HttpRequest(POST, url, _, HttpBody(_, body), _) => Json.parse[T](body.asString).map((url, _))
case _ => None
}
}

关于Scala 类型类模式和泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13361198/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com