Kotlin повторная проблема с параметризованным типом - PullRequest
3 голосов
/ 28 мая 2020

Почему следующее не работает? Кажется, что тип Foo передается неправильно, или это просто хорошо известная «проблема»?

Foo<T> не удается

data class Foo<T>(val a: T)
data class Bar(val b: String)
val objectMapper = ObjectMapper().registerKotlinModule()
val jsonString = "{\"a\": { \"b\": \"str\" }}"
fun main() {
    val parseJson = parseJson<Bar>()
}
private inline fun <reified T> parseJson(): T {
    val readValue: Foo<T> = objectMapper.readValue(jsonString)
    return readValue.a
}
class java.util.LinkedHashMap cannot be cast to class ..Bar 
(java.util.LinkedHashMap is in module java.base of loader 'bootstrap'; 
..Bar is in unnamed module of loader 'app')

1 Ответ

2 голосов
/ 28 мая 2020

Проблема в этом случае заключается в том, что вы не указываете класс, которому ObjectMapper должен попытаться сопоставить ваш jsonString. Дело еще больше усложняется тем, что тип Foo является параметром c.

Вам необходимо создать ссылку JavaType для перехода к objectMapper.readValue.

private inline fun <reified T> parseJson(): T {
    val javaType = objectMapper.typeFactory.constructParametricType(Foo::class.java, T::class.java)
    val readValue: Foo<T> = objectMapper.readValue(jsonString, javaType)
    return readValue.a
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...