[英]Scala Generic Function… using T in Function
我有點困惑為什么下面的代碼不起作用:
implicit val connectReads: Reads[ConnectCommand] = (
(JsPath \ "uuid").read[String]
)(ConnectCommand.apply _)
private def generateMessage[T](json: JsValue) = json.validate[T] match {
case s: JsSuccess[T] => s.asOpt
case e: JsError => None
}
該函數將如下調用:
generateMessage[ConnectCommand](json)
我收到以下錯誤:
Error:(59, 64) No Json deserializer found for type T. Try to implement an implicit Reads or Format for this type.
private def generateMessage[T](json: JsValue) = json.validate[T] match {
^
Error:(59, 64) not enough arguments for method validate: (implicit rds: play.api.libs.json.Reads[T])play.api.libs.json.JsResult[T].
Unspecified value parameter rds.
private def generateMessage[T](json: JsValue) = json.validate[T] match {
^
我對Scala泛型還很陌生...有什么方法可以做我在這里嘗試做的事情嗎?
根據文檔, JsValue.validate
要求隱式的Reads
才能使您的類型可用:
def validate[T](implicit rds: Reads[T]): JsResult[T]
假設您在調用generateMessage
的地方可以使用它,則必須將其傳遞給generateMessage
,以便validate
也可以看到它:
private def generateMessage[T](json: JsValue)(implicit rds: Reads[T])
或更短的形式:
private def generateMessage[T : Reads](json: JsValue)
這與泛型並沒有真正的關系,而是隱式以及庫如何要求您定義隱式類型並將其導入。
這是必需的,因為validate
函數不知道您的JsValue
的格式,因此需要implicit scope
提供一個。 然后,使用該格式進行驗證。 起初它很混亂,但最終會更好,因為當需要JSON格式時,您不必顯式提供每個方法調用的格式。
另外,以下兩條是在錯誤消息中刪除它的行:
Try to implement an implicit Reads or Format for this type.
not enough arguments for method validate: (implicit rds: play.api.libs.json.Reads[T])
我們看到您需要導入隱式的Format
/ Reads
或自己定義一個。 您可以在Play的相關部分中閱讀有關如何執行此操作的信息! 文件 。
編輯:
您的方法缺少隱式參數(implicit reads: Reads[T])
以將其傳遞給validate
函數:
private def generateMessage[T](json: JsValue)(implicit reads: Reads[T]) = json.validate[T] match {
case s: JsSuccess[T] => s.asOpt
case e: JsError => None
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.