Сохраненный тип в Kotlin
У обычной обобщенной функции имя параметра типа
исчезает во время выполнения, и выражение вроде
T::class для произвольного T
написать нельзя.
Если функцию одновременно встраивают и помечают
тип как reified, компилятор подставляет
конкретный класс в каждую точку вызова. Тогда
внутри тела снова доступен класс элемента:
inline fun <reified T> typeLabel(value: T): String {
return "${T::class.simpleName}:$value"
}
Вызов с разными аргументами дает разные подписи,
потому что вместо T каждый раз подставлен
свой класс:
fun main() {
println(typeLabel("api"))
println(typeLabel(404))
}
Без reified та же идея через параметр типа
не собирается: компилятор не знает, какой
KClass имел в виду автор функции. Рабочий
путь - встраивание плюс сохраненный тип. Так удобно
писать проверки, где класс согласован с аргументом,
без второго параметра вручную:
inline fun <reified T> isInt(value: Any): Boolean {
return T::class == Int::class && value is Int
}
Напишите функцию с параметром типа, которая
возвращает строку "int" или
"other" в зависимости от того, передали
ли число. Используйте класс параметра типа
внутри тела. Проверьте на 10 и на
"x".
Сделайте функцию, которая принимает значение
любого типа и возвращает его простое имя класса
и текст через двоеточие. Выведите результат
для логического true и для строки
"ok".