Стирание типов

Это процесс, при котором информация о типах, используемых в коде, теряется во время компиляции и выполнения, что означает, что они не сохраняются во время выполнения программы. Это особенно важно при работе с обобщенными типами (generics). При компиляции, все обобщенные типы заменяются их ограничивающими верхними типами или Any, а информация о конкретных типах удаляется.

class Container<T>(private val item: T) {
    fun getItem(): T {
        return item
    }
}

fun main() {
     // Создаем контейнер для строки
    val stringContainer = Container("Hello, Kotlin!")
    // Создаем контейнер для целого числа
    val intContainer = Container(42) 

    // В следующей строке мы не можем получить тип контейнера stringContainer, так как информация о типе стерта во время выполнения.
    // Таким образом, мы можем получить только Any (самый верхний тип).
    val itemFromContainer: Any = stringContainer.getItem()

    // То же самое происходит и с контейнером для целого числа.
    val anotherItem: Any = intContainer.getItem()

    // Мы можем убедиться, что типы данных контейнеров стираются, если мы попробуем привести элементы к типам String или Int.
    // Это вызовет ошибку времени выполнения.
    val stringFromContainer: String = itemFromContainer as String // Ошибка времени выполнения: ClassCastException
    val intFromContainer: Int = anotherItem as Int // Ошибка времени выполнения: ClassCastException
}