Разница между «*» и «Any» в генериках Котлина

Я не уверен, что полностью понимаю разницу между SomeGeneric<*> и SomeGeneric<Any> . Я думаю, что «*» представляет что угодно (wild card), а «Any» представляет объект, на который наследуются ВСЕ объекты. Кажется, они должны быть одинаковыми, но это не так?

Может быть полезно подумать о звездной проекции как способе представления не только любого типа, но и определенного фиксированного типа, который вы не знаете точно.

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

В контексте, я думаю, вы подразумеваете, SomeGeneric<*> эквивалентен SomeGeneric<out Any?> . Эквивалент Java – SomeGeneric<? extends Object> SomeGeneric<? extends Object> .

Синтаксис называется «звездные проекции». Вот официальные документы: https://kotlinlang.org/docs/reference/generics.html#star-projections