Стирание типов
Это процесс, при котором информация о типах, используемых в коде, теряется во время компиляции и выполнения, что означает, что они не сохраняются во время выполнения программы. Это особенно важно при работе с обобщенными типами (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
}