Ключевое слово reified
Ключевое слово reified
используется в сочетании
с ключевым словом inline
для параметров типа
в обобщенных функциях. Оно позволяет сохранять информацию
о типе во время выполнения, что делает возможным
проверку типа с помощью оператора is
и приведение
типа с помощью оператора as
.
Синтаксис
inline fun <reified T> functionName(parameters): ReturnType {
// тело функции с доступом к типу T во время выполнения
}
Пример
Создадим функцию для проверки типа элемента:
inline fun <reified T> isType(value: Any): Boolean {
return value is T
}
val str = "hello"
val num = 42
val isString = isType<String>(str)
val isInt = isType<Int>(num)
val isDouble = isType<Double>(str)
println("Is string: $isString")
println("Is int: $isInt")
println("Is double: $isDouble")
Результат выполнения кода:
Boolean true
Boolean true
Boolean false
Пример
Функция для фильтрации элементов определенного типа из списка:
inline fun <reified T> filterByType(list: List<Any>): List<T> {
return list.filter { it is T }.map { it as T }
}
val mixedList = listOf(1, "apple", 2.5, "banana", 3, "cherry")
val strings = filterByType<String>(mixedList)
val integers = filterByType<Int>(mixedList)
println("Strings: $strings")
println("Integers: $integers")
Результат выполнения кода:
List<String> ["apple", "banana", "cherry"]
List<Int> [1, 3]
Пример
Создание экземпляра класса с использованием рефлексии:
inline fun <reified T> createInstance(): T {
return T::class.java.getDeclaredConstructor().newInstance()
}
class Person {
override fun toString(): String = "Person object"
}
val person = createInstance<Person>()
println(person)
Результат выполнения кода:
Person object
Пример
Проверка типа в расширениях для универсальных классов:
inline fun <reified T> List<*>.firstOfType(): T {
return this.first { it is T } as T
}
val mixed = listOf(1, "first", 2, "second", 3)
val firstString = mixed.firstOfType<String>()
println("First string: $firstString")
Результат выполнения кода:
String "first"
Ограничения
Ключевое слово reified
имеет несколько ограничений:
- Может использоваться только с
inline
функциями - Не может быть применено к свойствам или классам
- Не может использоваться с nullable типами через
?
- Не поддерживает проверку на
null
для типа параметра
Смотрите также
-
class
,
основы создания классов в Kotlin