Как десериализовать контейнер джексона с помощью универсальных шаблонов

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

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

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

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

Я не понимаю твоей проблемы. Вы используете TData в качестве имени универсального типа, он расширяет / реализует IBulkModel и передается в RequestListWrapper как универсальный тип.

Zoe 13.09.2018 20:29
1
1
244
1

Ответы 1

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

У Джексона есть решение для этого; вы можете использовать фабрику типов из 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)
}

Другие вопросы по теме