2012-11-10 58 views
3

我試圖包裝spray-json解析器,使其返回Option而不是引發異常。如何在scala中的泛型方法中包裝泛型方法?

作爲第一步,我只是試圖用我自己的方法來包裝該方法,但我有問題使其通用。

解析器使用隱式格式對象(其被用於我使用的具體類型定義),但是當該方法是通用的編譯器會抱怨:

[error]  Cannot find JsonReader or JsonFormat type class for T 
[error]  def parse[T](s: String): T = JsonParser(s).convertTo[T] 

下面是相關的代碼:

case class Person(name: String) 

object Protocols { 
    implicit val personFormat = jsonFormat1(Person) 
} 

import spray.json._ 

object Parser { 
    import com.rsslldnphy.json.Protocols._ 
    // JsonParser(s).convertTo[Person] works fine, but.. 
    def parse[T](s: String): T = JsonParser(s).convertTo[T] // .. doesn't 
} 

我需要做些什麼才能使其發揮作用?

回答

5

您需要將所需的隱含價值,它可以方便地使用「上下文約束」的快捷符號來進行:

def parse[T : JsonReader](s: String): T = 
    JsonParser(s).convertTo[T] 

這相當於:

def parse[T](s: String)(implicit reader: JsonReader[T]): T = 
    JsonParser(s).convertTo[T] 

What is a "context bound" in Scala?

+0

王牌,謝謝你!不知道我是快捷方式的粉絲,所以我認爲我會堅持「更明確的隱含」,可以這麼說。 – Russell

+1

我建議你習慣這種表示法,因爲它在慣用的scala代碼中很流行。實際上,只要將'JsonReader'看作一個類型類,這個符號就很有意義。請參閱http://stackoverflow.com/questions/5408861/what-are-type-classes-in-scala-useful-for –

+0

我不一定要編寫慣用的Scala代碼。在我看來,Scala在簡潔性方面落在少數幾次,而這就是其中之一。 – Russell