Самый простой способ - использовать 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))
...
}
если вы вызовете функцию без неявного экземпляра в области видимости, вы получите ошибку времени компиляции.