Дисперсия - это всегда сложная концепция для проработки ...
Если вы используете термины «производитель» и «потребитель», учтите, что они относятся к вашему взаимодействию с рассматриваемым элементом ‚в данном случаепараметр MutableList
.
Ваша первая функция с параметром MutableList<out Shape>
может принимать список Shape
s или список любого подкласса Shape
.(out
означает примерно «или любой подкласс».)
В каждом случае, если вы используете список, все, что вы извлекаете из списка, всегда будет Shape
(как подтверждает IDE).).
Но если вы хотите поместить что-то в список (как производитель), вы не можете сказать, что было бы безопасно добавить, поскольку это зависело бы от того, является ли этои какой подкласс.
Ваша вторая функция с параметром MutableList<in Shape>
противоположна: она может принимать список Shape
с или список любого суперкласса Shape
.(in
означает примерно «или любой суперкласс».)
В каждом случае всегда безопасно добавить Shape
в список (как производитель).Но вы ничего не можете сказать о типе того, что вы вытаскиваете из этого (как потребитель): его можно вызвать с MutableList<Any?>
, который может содержать String
s или File
с или что угодно.Таким образом, компилятор присвоит ему универсальный тип Any?
(как подтверждает IDE).