Этот пост посвящен образцу, который демонстрирует способность Kotlin умело изменять параметры универсального типа .
Итак, рассмотрим сначала мир, где Kotlin не поддерживает эту функцию. Если бы мы использовали библиотеку Джексона для преобразования JSON в карту с ключами на основе строк и значениями на основе целых чисел, я бы использовал код в следующих строках:
| 01 02 03 04 05 06 07 08 09 10 11 12 13 | @Testfun `sample parameterized retrieval raw object mapper`() {    val objectMapper = ObjectMapper()    val map: Map<String, Int> = objectMapper.readValue("""        | {        |   "key1": 1,        |   "key2": 2,        |   "key3": 3        | }        """.trimMargin(), object : TypeReference<Map<String, Int>>() {})    assertThat(map).isEqualTo(mapOf("key1"to 1, "key2"to 2, "key3"to 3))} | 
Упомянутый выше TypeReference реализует шаблон, называемый токеном Super type, который позволяет захватывать тип параметризованного типа посредством подкласса. Обратите внимание на уродливый способ создания анонимного подкласса в Kotlin.
| 1 | object : TypeReference<Map<String, Int>>() {} | 
Я хотел бы вызвать ObjectMapper следующим образом:
| 01 02 03 04 05 06 07 08 09 10 11 12 13 | @Testfun `sample parameterized retrieval`() {    val om = ObjectMapper()    val map: Map<String, Int> = om.readValue("""        | {        |   "key1": 1,        |   "key2": 2,        |   "key3": 3        | }        """.trimMargin())    assertThat(map).isEqualTo(mapOf("key1"to 1, "key2"to 2, "key3"to 3))} | 
Параметр универсального типа выводится на основе типа того, что должно быть возвращено (левая часть).
Это может быть достигнуто с помощью функции расширения ObjectMapper, которая выглядит следующим образом:
| 1 2 | inline fun <reified T> ObjectMapper.readValue(s: String): T =         this.readValue(s, object : TypeReference<T>() {}) | 
Встроенная функция является основой поддержки возможности изменения параметра универсального типа здесь — после компиляции функция будет развернута в любое место, где вызывается эта функция, и, следовательно, вторая версия точно такая же, как и первая версия теста. но читает гораздо лучше, чем раньше.
Обратите внимание, что Джексон уже реализует эти функции расширения Kotlin в превосходной библиотеке jackson-module-kotlin .
| Смотреть оригинальную статью здесь: Kotlin — Пример параметров Reified type Мнения, высказанные участниками Java Code Geeks, являются их собственными. |