![](/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.