簡體   English   中英

Scala泛型函數…在函數中使用T

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM