Ключевое слово reified



reified
— это ключевое слово, которое может быть использовано только в inline-функциях. reified позволяет получить информацию о типе generic-параметра во время выполнения программы. В обычном случае, информация о типах стирается и недоступна во время выполнения, но с помощью reified можно сохранять эту информацию и использовать в других частях приложения.



Несколько простых примеров применения:



1. Получить доступ к типу параметра во время выполнения



fun main() {

printType<String>() // String

printType<Int>() // Int

}



private inline fun <reified T> printType() {

println(T::class.simpleName)

}



В этом примере мы определяем функцию printType() с типовым параметром T, который мы указываем с помощью reified. Внутри функции мы можем получить тип T во время выполнения, используя T::class. Затем выводим название типа на экран с помощью simpleName. Когда мы вызываем функцию printType() с типом String или Int, она выводит соответствующий тип на экран.



2. reified вместе с is для проверки типа аргумента во время выполнения



fun main() {

println(isOfType<Int>(1)) // true

println(isOfType<Int>("Hello")) // false

}



private inline fun <reified T> isOfType(value: Any): Boolean {

return value is T

}



Здесь мы определяем функцию isOfType(), которая принимает значение типа Any и возвращает true, если оно является типом T. Мы используем reified, чтобы получить доступ к типу T во время выполнения. Затем мы используем оператор is для проверки типа значения и возвращаем соответствующее boolean значение.



3. Получить список элементов перечисления



enum class Color { RED, GREEN, BLUE }



fun main() {

printEnumValues<Color>() // RED, GREEN, BLUE

}



private inline fun <reified T : Enum<T>> printEnumValues() {

enumValues<T>().forEach { value ->

println(value)

}

}



Определяем функцию printEnumValues(), которая выводит список элементов перечисления типа T. Мы применяем reified, чтобы получить доступ к типу T во время выполнения. Затем используем enumValues<T>(), чтобы получить список всех значений перечисления типа T. Внутри цикла выводим каждое значение на экран. Когда мы вызываем функцию printEnumValues() с типом Color, она выводит "RED", "GREEN" и "BLUE" в консоль.