Scala:在方法中使用TypeTag

时间:2016-06-09 20:03:34

标签: scala scala-reflect

我正在尝试编写一个这样的方法:

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?无法澄清我的目标。它看起来像是试图过滤"关于某些课程的一些信息。

2 个答案:

答案 0 :(得分:1)

如果您需要的是ClassTag,那么为什么不将[{1}}的方法更改为foo?像这样:

ClassTag

这似乎满足了您在隐式范围内声明存在def foo[T](value: Int)(implicit ev: ClassTag[T]): String ={ ... 的基本需求。

修改

您展示的内容与ClassTag无关,而是与ClassTagJsonWriter的隐含错误有关。您可能缺少导入以将其纳入范围。

答案 1 :(得分:1)

阅读错误:mapTo有效。它是toJson,但它不应该:你不能将任何T转换为TypeTag到JSON。只需要T也必须有JsonWriterdef foo[T: TypeTag: JsonWriter](value: Int) = ...。您还会获得Future[String],而不是String