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?

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.


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.