Diferencia entre "*" y "Cualquiera" en los genéricos de Kotlin

106

No estoy seguro de entender completamente la diferencia entre SomeGeneric<*>y SomeGeneric<Any>. Creo que *representa cualquier cosa (comodín) y Anyrepresenta el objeto del que TODOS los objetos heredan. Entonces parece que deberían ser iguales, pero ¿lo son?

Constructor de ruedas
fuente

Respuestas:

158

Puede ser útil pensar en la proyección de estrellas como una forma de representar no cualquier tipo, sino algún tipo fijo que no sabes qué es exactamente.

Por ejemplo, el tipo MutableList<*>representa la lista de algo (no sabe exactamente qué). Entonces, si intenta agregar algo a esta lista, no tendrá éxito. Puede ser una lista de Stringcorreos electrónicos, o una lista de Intcorreos electrónicos, o una lista de algo más. El compilador no permitirá poner ningún objeto en esta lista porque no puede verificar que la lista acepte objetos de este tipo. Sin embargo, si intenta sacar un elemento de dicha lista, seguramente obtendrá un objeto de tipo Any?, porque todos los objetos en Kotlin heredan de Any.

Del comentario de asco a continuación:

Además, List<*>puede contener objetos de cualquier tipo, pero solo ese tipo, por lo que puede contener cadenas (pero solo cadenas), mientras que List<Any> puede contener cadenas y números enteros y todo eso, todo en la misma lista.

Alexander Udalov
fuente
83
Buena respuesta, para algunos puede ser útil agregar que List <*> puede contener objetos de cualquier tipo, pero solo ese tipo, por lo que puede contener Strings (pero solo Strings), mientras que List <Any> puede contener Strings e Integers y lo que sea, todo en la misma lista.
fweigl
1
Aquí un artículo interesante con una explicación similar: typealias.com/guides/star-projections-and-how-they-work
croc