Diferença entre “*” e “Qualquer” nos genéricos Kotlin

106

Não tenho certeza se entendi totalmente a diferença entre SomeGeneric<*>e SomeGeneric<Any>. Acho que *representa qualquer coisa (curinga) e Anyrepresenta o objeto do qual todos os objetos herdam. Então, parece que eles deveriam ser os mesmos, mas são?

Construtor de rodas
fonte

Respostas:

158

Pode ser útil pensar na projeção estelar como uma forma de representar não qualquer tipo, mas algum tipo fixo que você não sabe exatamente o que é.

Por exemplo, o tipo MutableList<*>representa a lista de algo (você não sabe o que exatamente). Portanto, se você tentar adicionar algo a essa lista, não terá sucesso. Pode ser uma lista de Strings, ou uma lista de Ints, ou uma lista de outra coisa. O compilador não permitirá colocar nenhum objeto nesta lista porque não pode verificar se a lista aceita objetos desse tipo. No entanto, se você tentar obter um elemento dessa lista, certamente obterá um objeto do tipo Any?, porque todos os objetos em Kotlin herdam de Any.

De asco comentário abaixo:

Além disso, List<*>pode conter objetos de qualquer tipo, mas apenas daquele tipo, então pode conter Strings (mas apenas Strings), enquanto List<Any> pode conter Strings e Inteiros e outros enfeites, todos na mesma lista.

Alexander Udalov
fonte
83
Boa resposta, para alguns pode ser útil adicionar que List <*> pode conter objetos de qualquer tipo, mas apenas aquele tipo, então pode conter Strings (mas apenas Strings), enquanto List <Qualquer> pode conter Strings e Inteiros e enfeites, tudo na mesma lista.
fweigl
1
Aqui está um artigo interessante com uma explicação semelhante: typealias.com/guides/star-projections-and-how-they-work
croc
28

No contexto, acho que você insinua, SomeGeneric<*>é equivalente a SomeGeneric<out Any?>. O equivalente em Java é SomeGeneric<? extends Object>.

A sintaxe chamada "projeções de estrelas". Aqui estão os documentos oficiais: https://kotlinlang.org/docs/reference/generics.html#star-projections

voddan
fonte