outКовариантность означает, что параметр типа используется только как выход (производится/читается). Пометка типа с помощью out означает, что ты можешь читать значения этого типа, но не можешь писать в него.
class Producer<out T>(val value: T) {
fun produce(): T = value // allowed
}
Producer<Cat> можно использовать там, где ожидается Producer<Animal>T в класс? extends T из JavainКонтравариантность означает, что параметр типа используется только как вход (потребляется/пишется). Пометка типа с помощью in означает, что ты можешь писать значения этого типа, но не можешь читать из него.
class Consumer<in T> {
fun consume(value: T) { ... } // allowed
}
Consumer<Animal> можно использовать там, где ожидается Consumer<Cat>T из класса? super T из JavaПростой способ запомнить различие:
out → только для чтения, подтип течёт вверх по иерархииin → только для записи, супертип течёт вниз по иерархииval animals: List<out Animal> = listOf<Cat>() // covariant, read-only
val comparator: Comparator<in Cat> = Comparator<Animal> { a, b -> ... } // contravariant
Использование out и in обеспечивает типобезопасность на этапе компиляции, ограничивая способы использования обобщённого типа и предотвращая небезопасные чтения или записи, которые могли бы вызвать ошибки на этапе выполнения.
Когда параметр типа отмечен как out, ты можешь читать значения этого типа из класса, но не можешь писать или передавать значения этого типа в класс.
Новый — ещё не проверен сообществом
Вы