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?

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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.