Scala:可以在运行时使用泛型类型吗?

时间:2017-07-05 12:14:23

标签: scala

我想知道我是否可以改变这种方法的实现:

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
}

2 个答案:

答案 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)