Ответ 1
Может быть полезно думать о звездной проекции как о способе представления не просто какого-либо типа, а некоторого фиксированного типа, который вы не знаете, что именно.
Например, тип MutableList<*>
представляет список чего-либо (вы не знаете, что именно). Поэтому, если вы попытаетесь добавить что-то в этот список, у вас ничего не получится. Это может быть список String
, или список Int
, или список чего-то еще. Компилятор вообще не разрешит помещать какой-либо объект в этот список, потому что он не может проверить, что список принимает объекты этого типа. Однако, если вы попытаетесь получить элемент из такого списка, вы обязательно получите объект типа Any?
потому что все объекты в Kotlin наследуются от Any
.
Из комментария АСКО ниже:
Кроме того,
List<*>
может содержать объекты любого типа, но только этого типа, поэтому он может содержать строки (но только строки), в то время какList<Any>
может содержать строки и целые числа и тому подобное, все в одном списке.