#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]
}
Это:
-
Предоставляет вашему методу неявные параметры, которые должны выполняться вызывающим объектом.
-
Создает (те же самые) неявные параметры для их передачи
extract
.