Я только недавно начал испытывать Kotlin, и я до сих пор поражен этим.Тем не менее, я не могу полностью понять, как здесь работают дженерики.
Я хочу прочитать файл YAML, который выглядит следующим образом:
- id: acrobatics
name: Akrobatik
description:
...
Простой класс данных для сопоставленияэто к:
data class Skill (
val id: String,
val name: String,
val description: String
)
Теперь перейдем к интересной части. По-видимому, он работает с генериками! Я начал с этой функции, которая выполняет свою работу, как задумано:
fun loadSkills(): List<Skill> {
val resource: URL = classLoader.getResource("rulebook/skills.yml")!!
val items: List<Skill> = resource.openStream()
.bufferedReader().use() { reader ->
objectMapper.readValue<List<Skill>>(reader)
}
return items
}
Однако я хочу использовать это повторно, поэтому я попытался создать универсальныйfunction:
protected fun <R: Any> loadList(path: String): List<R> {
val resource: URL = classLoader.getResource(path)!!
val items: List<R> = resource.openStream()
.bufferedReader().use() { reader ->
objectMapper.readValue<List<R>>(reader)
}
return items
}
А моя первоначальная функция просто вызывает:
return loadList<Skill>("rulebook/skills.yml")
А теперь мои тесты не пройдены, потому что я получаю список LinkedHashMaps, который, по-видимому, является типом данных по умолчанию, используемымПарсер YAML для отображения объектов.Я прочитал немного больше и попытался изменить подпись моего метода на встроенную функцию с параметром reified типа:
protected inline fun <reified R: Any> loadList(path: String): List<R>
Но это, похоже, ничего не меняет.Есть ли способ сделать это элегантно?