Как узнать тип Generic в теле функции

«Как узнать тип Generic в теле функции» — вопрос из категории Kotlin, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Java и Kotlin тип Generic стирается во время выполнения, поэтому напрямую узнать его нельзя. Однако можно использовать reified типы с inline функциями в Kotlin:

inline fun <reified T> checkType(value: Any) {
    if (value is T) {
        println("Value is of type ${T::class.java}")
    } else {
        println("Value is NOT of type ${T::class.java}")
    }
}

// Использование:
checkType<String>("test") // Выведет: Value is of type class java.lang.String

Ключевые моменты:

  1. reified сохраняет информацию о типе во время выполнения
  2. Функция должна быть inline
  3. Работает только в Kotlin
  4. В Java такой возможности нет из-за стирания типов

Для не-reified случаев можно передавать Class параметром:

fun <T> checkType(value: Any, clazz: Class<T>) {
    if (clazz.isInstance(value)) {
        println("Value is of type $clazz")
    }
}