我正在尝试编写一个这样的方法:
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)
^
此链接How to get ClassTag form TypeTag, or both at same time?无法澄清我的目标。它看起来像是试图过滤"关于某些课程的一些信息。
答案 0 :(得分:1)
如果您需要的是ClassTag
,那么为什么不将[{1}}的方法更改为foo
?像这样:
ClassTag
这似乎满足了您在隐式范围内声明存在def foo[T](value: Int)(implicit ev: ClassTag[T]): String ={ ...
的基本需求。
修改强>:
您展示的内容与ClassTag
无关,而是与ClassTag
或JsonWriter
的隐含错误有关。您可能缺少导入以将其纳入范围。
答案 1 :(得分:1)
阅读错误:mapTo
有效。它是toJson
,但它不应该:你不能将任何T
转换为TypeTag
到JSON。只需要T
也必须有JsonWriter
:def foo[T: TypeTag: JsonWriter](value: Int) = ...
。您还会获得Future[String]
,而不是String
。