2016-06-09 53 views
0

我想写这样的方法:斯卡拉:在方法中使用TypeTag

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

[如何获得ClassTag表单TypeTag,或两者同时?](http://stackoverflow.com/questions/18729321/how-to-get-classtag-form-typetag-or-both-在同一时间) – Kolmar

+0

我无法从你的建议中得到答案。 – Randomize

回答

1

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

+0

谢谢。你的建议奏效了!这是所需的最终签名:'foo [T:TypeTag:JsonWriter](value:Int)(隐式标签:ClassTag [T]):StandardRoute' – Randomize

1

如果你需要的是一个ClassTag那么为什么不改变方法fooClassTag?像这样:

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

这似乎满足您的宣称存在着隐含的范围ClassTag的基本需要。

编辑

你显示什么无关,与ClassTag什么都做的事实,它缺少implicits为JsonWriterJsonFormat。您可能会错过一次导入以将其纳入范围。

+0

我已经试过了,但是我在'bar [T]'中传递了什么?编译问题在'bar'中。 – Randomize

+0

@Randomize所以你说'val yo = something.bar [T]'不起作用? – wheaties

+0

是的。我在最初的问题中增加了更多细节。 – Randomize