Подтвердить что ты не робот

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

Я не уверен, что полностью понимаю разницу между SomeGeneric<*> и SomeGeneric<Any>. Я думаю, что "*" представляет что угодно (wild card), а "Any" представляет объект, из которого наследуются объекты ALL. Так что, похоже, они должны быть одинаковыми, но это не так?

4b9b3361

Ответ 1

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

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

Из комментария АСКО ниже:

Кроме того, List<*> может содержать объекты любого типа, но только этого типа, поэтому он может содержать строки (но только строки), в то время как List<Any> может содержать строки и целые числа и тому подобное, все в одном списке.

Ответ 2

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

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