最简单的方法是使用ADT,如第一条评论链接中所述。
如果不想更改中接受的类型
jsonBinder
然后您可以使用一个类型类来解决这个问题。
例如
trait JsonBindValue[T] {
def value(t: T): String
}
然后,您必须为接受的数据类型提供实例
object JsonBindValue {
implicit val OptJsBinder = new JsonBindValue[Option[JsValue]] {
def value(t: Option[JsValue]): String = {
t.map(Json.stringify).orNull
}
}
... more instances here
}
最后,您的函数如下所示:
def jsonBinder[T : JsonBindValue](json: T, jsonType: java.lang.String = "json"): ParameterBinderWithValue = {
val binder = implicitly[JsonBindValue[T]]
jsonObject.setType(jsonType)
jsonObject.setValue(binder.value(json))
...
}
如果在作用域中调用没有隐式实例的函数,则会得到编译时错误。