Как в runtime получить доступ к типу дженерика

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

Ответ

В Java/Android получить тип дженерика в runtime напрямую невозможно из-за type erasure - информация о типе стирается во время компиляции. Однако есть обходные пути:

  1. Через передачу Class в конструктор:
class GenericClass<T>(private val clazz: Class<T>) {
    fun getType(): Class<T> = clazz
}

// Использование
val instance = GenericClass(String::class.java)
val type = instance.getType() // вернет String::class.java
  1. Через рефлексию и ParameterizedType (если дженерик используется в поле/методе):
val field = MyClass::class.java.getDeclaredField("genericList")
val type = (field.genericType as ParameterizedType).actualTypeArguments[0]
  1. Используя inline функции с reified типами:
inline fun <reified T> getType(): Class<T> = T::class.java