Как десериализовать контейнер Джексона с помощью Generics Generics - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть подпись для метода, который выглядит следующим образом:

inline fun <reified TData: IBulkModel?> bulkCreate(path: String) {
    val type = jacksonTypeRef<RequestListWrapper<TData>>()
}

Это еще не все, но это уместная часть. У меня есть опроверженный T здесь во встроенной функции. Я ожидаю, что T здесь будет фактическим T для функции для любого данного вызова, но это не так, это IBulkModel.

Есть ли способ заставить это работать с Kotlin, или я застрял, проходя весь класс?

1 Ответ

0 голосов
/ 13 сентября 2018

Параметры вложенного типа теряются даже в уточненных параметрах. Единственный сохранившийся тип - это верхний уровень.

У Джексона есть решение для этого; вы можете использовать фабрику типов из Java:

data class Generic<T>(val t: T)

fun main(args: Array<String>)
{
    val mapper = ObjectMapper()

    val type: JavaType = mapper.typeFactory
                               .constructParametricType(Generic::class.java, Int::class.java)

    val instance: Generic<Int> = mapper.readValue("""{"t":32}""", type)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...