2016-06-09 82 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