【问题标题】:Scala: Using TypeTag in a methodScala:在方法中使用 TypeTag
【发布时间】:2016-06-09 20:03:34
【问题描述】:

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

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? 没有说明我要做什么。看起来像是试图“过滤”一些关于某个类的信息。

【问题讨论】:

标签: scala scala-reflect


【解决方案1】:

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

【讨论】:

  • 谢谢。你的建议奏效了!这是所需的最终签名:foo[T:TypeTag:JsonWriter](value: Int)(implicit tag: ClassTag[T]): StandardRoute
【解决方案2】:

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

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

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

编辑

您所展示的内容与ClassTag 无关,而与它缺少JsonWriterJsonFormat 的隐含意义有关。您可能错过了将它们纳入范围的导入。

【讨论】:

  • 我已经尝试过了,但是我在bar[T]中传递了什么?编译问题在bar
  • @Randomize 所以你是说val yo = something.bar[T] 不起作用?
猜你喜欢
  • 2012-10-25
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-06
  • 2016-09-12
  • 2019-06-27
  • 1970-01-01
相关资源
最近更新 更多