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

Ключевое слово reified используется в сочетании с ключевым словом inline для параметров типа в обобщенных функциях. Оно позволяет сохранять информацию о типе во время выполнения, что делает возможным проверку типа с помощью оператора is и приведение типа с помощью оператора as.

Синтаксис

kotlininline fun <reified T> functionName(parameters): ReturnType {
  // тело функции с доступом к типу T во время выполнения
}

Пример

Создадим функцию для проверки типа элемента:

kotlininline 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")

Результат выполнения кода:

kotlinBoolean true
Boolean true
Boolean false

Пример

Функция для фильтрации элементов определенного типа из списка:

kotlininline 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")

Результат выполнения кода:

kotlinList<String> ["apple", "banana", "cherry"]
List<Int> [1, 3]

Пример

Создание экземпляра класса с использованием рефлексии:

kotlininline 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)

Результат выполнения кода:

kotlinPerson object

Пример

Проверка типа в расширениях для универсальных классов:

kotlininline 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")

Результат выполнения кода:

kotlinString "first"

Ограничения

Ключевое слово reified имеет несколько ограничений:

Смотрите также

  • class,
    основы создания классов в Kotlin