0

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

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,或同时获取两者?不澄清我要做什么。看起来像是试图“过滤”一些关于某个类的信息。

4

2 回答 2

1

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

于 2016-06-10T06:39:04.647 回答
1

如果你需要的是 aClassTag那么为什么不改变foo拥有的方法ClassTag呢?像这样:

def foo[T](value: Int)(implicit ev: ClassTag[T]): String ={ ...

这似乎满足了您声明存在ClassTag隐式范围的基本需求。

编辑

您所显示的内容与它缺少 a或 aClassTag的隐式这一事实无关,而且与一切有关。您可能缺少将它们纳入范围的导入。JsonWriterJsonFormat

于 2016-06-09T20:43:22.373 回答