gpt4 book ai didi

scala:定义一个已经定义了某个隐式的类型

转载 作者:行者123 更新时间:2023-12-04 18:13:51 24 4
gpt4 key购买 nike

我想定义一个泛型类型 T 的函数,其中 T 有某个方法的隐式实现

事实上,我正在努力实现以下目标:

我有非常重复的代码,如下所示:

def update(id: Long) = CORSAction { implicit request =>
request.body.asJson.map { json =>
json.asOpt[Wine].map { wine =>
wine.copy(id=Id(id)).update.fold(
errors => JsonBadRequest(errors),
wine => Ok(toJson(wine).toString)
)
}.getOrElse (JsonBadRequest("Invalid Wine entity"))
}.getOrElse (JsonBadRequest("Expecting JSON data"))
}

所以,检查它是否是一个有效的 json 然后解析它,是我想封装在一个函数中的一个非常常见的任务。

对于 wine 类型,我定义了一个隐式 JsonWineFormatter,它实现了一个 writes 和 reads 方法来从 json 解析并呈现为 json 一个 wine 对象
object WineFormatter {

implicit object JsonWineFormatter extends Format[Wine] {

def writes(o: Wine): JsValue = {
toJson( Map(
"id" -> toJson(o.id),
[...]

def reads(j: JsValue): Wine = {
Wine(
id = (j \ "id").as[Option[Pk[Long]]]
[...]

所以我试图定义一个像这样的通用方法:
def parse[T](implicit request: Request[AnyContent]): Option[T] = {
request.body.asJson.map { json =>
json.asOpt[T].map { entity =>
entity
}
}
}

但我收到以下错误:

找不到类型 T 的 Json 反序列化器。尝试为此类型实现隐式读取或格式。

我需要指定泛型类型 T 需要和隐式读取...

你知道如何实现吗?

--

编辑:我尝试了以下内容:
import play.api.libs.json.JsValue
type EntityWithJsonFormatter[T] = T {def reads(j: JsValue): T}

def parse[T: EntityWithJsonFormatter](request: Request[AnyContent]): Option[T] = {
request.body.asJson.map { json =>
json.asOpt[T].map { entity =>
entity
}
}
}

但显然,不是 T 应该实现读取,而是应该有一个隐式对象来实现它。我不知道如何在类型中指定它...

最佳答案

JsValue文档定义 asOpt因此:

def asOpt [T] (implicit fjs: Reads[T]): Option[T] 

所以如果你 import play.api.libs.json.Reads然后
def parse[T: Reads]( ...

应该做的伎俩。

关于scala:定义一个已经定义了某个隐式的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12102754/

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