Передача информации о типе для функции в Scala

#function #scala #types

#функция #scala #типы

Вопрос:

У меня есть код, который выполняет некоторые общие операции с объектами json, а именно extract . Итак, что я хотел бы создать универсальную функцию, которая принимает параметр типа, какой класс ожидать, код выглядит следующим образом:

 def getMessageType[T](json: JValue): Either[GenericError,T] = {
  try {
    Right(json.extract[T])
  } catch {
    case e: MappingException => jsonToError(json)
  }
}
  

Проблема в том, как передать информацию T этой функции?

Ответ №1:

Если вы посмотрите на определение extract: вы увидите, что оно принимает Manifest неявно:

 def extract[A](json: JValue)
    (implicit formats: Formats, mf: Manifest[A]): A
  

Это позволяет обойти удаление типа JVM, принимая «тип» в качестве значения. В вашем
случае, я думаю, вам следует сделать то же самое:

 def getMessageType[T](json: JValue)
    (implicit f: Formats, mf: Manifest[T]): T =
{
    json.extract[T]
}
  

Это:

  1. Предоставляет вашему методу неявные параметры, которые должны выполняться вызывающим объектом.

  2. Создает (те же самые) неявные параметры для их передачи extract .