我想知道我是否可以改变这种方法的实现:
def foo() {
val json : String = ; // get json from somewhere
val jsonAst = new String(json).parseJson // or JsonParser(source)
val msg = jsonAst.convertTo[UserDetails]
}
所以我可以提供“UserDetails”作为参数
所以调用foo会是这样的:
foo[UserDetails]()....
顺便说一下:
convertTo签名是:
def convertTo[T :JsonReader]: T = jsonReader[T].read(this)
trait JsonReader[T] {
def read(json: JsValue): T
}
答案 0 :(得分:2)
您应该能够以相同的方式声明您的功能:
def foo[T : JsonReader] = {
...
val msg = jsonAst.convertTo[T]
}
更新详细说明,因为评论中似乎有些混乱。 def foo[T : JsonReader]
不表示它只接受JsonReader
的子类。该声明实际上与此相当:def foo[T](implicit jsonReader: JsonReader[T])
答案 1 :(得分:0)
Dima的解决方案应该有效,但是你的convertTo实现看起来很奇怪。我认为它应该是这样的:
def convertTo[T :JsonReader]: T = implicitly[JsonReader[T]].read(this)