![](/img/trans.png)
[英]Scala compiler says “No TypeTag available for T” in method using generics
[英]Scala: Using TypeTag in a method
我正在嘗試編寫這樣的方法:
def foo[T:TypeTag](value: Int):String = {
(/* do something */).mapTo[T].map(_.toJson)
}
其中mapTo
具有簽名:
def mapTo[S](implicit tag: ClassTag[S]): Future[S] = { ... }
使用org.scala-lang.scala-reflect
能夠執行以下操作:
foo[String](1)
, foo[List[Double]](10)
等。
我嘗試以不同的方式編寫它,但是遇到了不同的編譯錯誤。 有什么辦法可以使類似的東西起作用嗎?
Error:(26, 45) Cannot find JsonWriter or JsonFormat type class for T
(/* do something */).mapTo[T].map(_.toJson)
^
Error:(26, 45) not enough arguments for method toJson: (implicit writer: spray.json.JsonWriter[T])spray.json.JsValue.
Unspecified value parameter writer.
(/* do something */).mapTo[T].map(_.toJson)
^
此鏈接如何同時從TypeTag獲得ClassTag或同時獲得二者? 不清楚我要做什么。 似乎試圖“過濾”有關某個類的某些信息。
如果您需要的是ClassTag
那么為什么不更改foo
的方法以擁有ClassTag
? 像這樣:
def foo[T](value: Int)(implicit ev: ClassTag[T]): String ={ ...
這似乎可以滿足您聲明隱式范圍中存在ClassTag
基本需求。
編輯 :
您所顯示的內容與ClassTag
無關,並且與它缺少JsonWriter
或JsonFormat
的隱式事實JsonFormat
。 您可能缺少導入內容以將其納入范圍。
讀取錯誤: mapTo
有效。 是toJson
,不是,它不應該:您不能將任何帶有TypeTag
T
轉換為JSON。 只需要求T
必須具有JsonWriter
: def foo[T: TypeTag: JsonWriter](value: Int) = ...
您還將獲得Future[String]
而不是String
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.