Назад к вопросам
Senior
126
questionbank

Что ты знаешь о принципе звёздной проекции?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Принцип звёздной проекции (Star Projection) в Kotlin — это способ безопасного использования генериков, когда не важен конкретный тип аргумента, но нужно обеспечить типобезопасность.

Применяется в следующих случаях:

  • *: Эквивалентен Any?. Обозначает, что тип аргумента неизвестен и нет информации о его границах. Можно читать только элементы, которые являются экземплярами Any?, и нельзя записывать никакие, кроме null.

    // Чтение из списка с неизвестным типом
    fun readFromList(list: List<*>) {
        val item: Any? = list.firstOrNull()
        // Можно безопасно читать как Any?
    }
    
  • in *: Эквивалентен in Nothing. Используется для ковариантных типов (out), когда не важен конкретный нижний тип. Можно только записывать элементы (типа Nothing, что невозможно), но нельзя читать.

    // Невозможно безопасно добавлять элементы в список с ковариантным типом
    fun addToList(list: MutableList<out *>) {
        // list.add(...) // Не скомпилируется
    }
    
  • out *: Эквивалентен out Any?. Используется для контравариантных типов (in), когда не важен конкретный верхний тип. Можно только читать элементы (как Any?), но нельзя записывать.

    // Чтение из компаратора с контравариантным типом
    fun compare(comparator: Comparator<in *>) {
        // Можно вызвать методы, которые НЕ принимают тип T
        // comparator.compare(obj1, obj2) // Не скомпилируется без приведения типов
    }
    

Основное назначение звёздных проекций — безопасное взаимодействие с generic-классами и функциями, когда полный тип аргумента неизвестен или несущественен для текущей операции. Это помогает избежать unsafe cast и поддерживать типобезопасность.

Примеры использования:

  • Работа с коллекциями, когда важен только факт наличия элементов, но не их конкретный тип.
  • Приведение типов для generic-объектов.
  • Интероперабельность с Java-кодом, использующим raw types.