В чем разница между Star-projection и Any

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

Ответ

Star-projection (*) и Any в Kotlin используются для разных целей:

  • *Star-projection (`)** — используется в обобщенных типах, когда тип аргумента неизвестен или неважен. Например,List<*>означаетList` с неизвестным типом элементов. Доступен только для чтения, так как компилятор не знает точный тип.
    Пример:
fun printList(list: List<*>) {
    for (item in list) println(item) // можно читать, но нельзя добавлять
}
  • Any — супертип всех классов в Kotlin. List<Any> принимает элементы любого типа, но тип известен (Any). Можно и читать, и записывать (add).
    Пример:
fun addToList(list: MutableList<Any>) {
    list.add("String") // разрешено, так как Any включает String
}

Ключевое отличие: * — неизвестный тип (безопасность на чтение), Any — известный тип, включающий всё (можно и читать, и писать).