Гораздо лучшая идея в ситуациях, подобных этим, где вы испытываете желание использовать последовательности тестов для манифестов или классов (или в общем случае для определения типов), - это использовать класс типов.В данном конкретном случае это будет выглядеть так:
// Type class
trait JsonReader[T] {
def apply(json : String) : T
}
// Type class instance for type Map[String, Any]
implicit def mapReader = new JSonReader[Map[String, Any]] {
def apply(json : String) =
JsonParser.jsonToMap(json).asInstanceOf[Map[String, Any]]
}
def read[T](json : String)(implicit reader : JsonReader[T]) : T = reader(json)
Вы должны добавить экземпляры типов для всех типов, которые вас интересуют.
Теперь вы можете вызывать функцию чтения следующим образом:
read[Map[String, Any]](... some json ...)
Обратите внимание, что теперь, если вы попытаетесь вызвать его с параметром типа, соответствующим типу, для которого вы не предоставили экземпляр класса типа, результатом будет ошибка во время компиляции, а не UnsupportedOperationException
во время выполнения.