descargar - Diferencia entre "*" y "Cualquiera" en los genéricos de Kotlin
kotlin vs scala (2)
En el contexto que creo que implica,
SomeGeneric<*>
es equivalente a
SomeGeneric<out Any?>
.
El equivalente de Java es
SomeGeneric<? extends Object>
SomeGeneric<? extends Object>
.
La sintaxis llamada "proyecciones de estrellas". Aquí están los documentos oficiales: https://kotlinlang.org/docs/reference/generics.html#star-projections
No estoy seguro de entender completamente la diferencia entre
SomeGeneric<*>
y
SomeGeneric<Any>
.
Creo que "*" representa cualquier cosa (comodín) y "Cualquiera" representa el objeto del que
TODOS los
objetos heredan.
Entonces parece que deberían ser lo mismo, pero no lo son.
Puede ser útil pensar en la proyección de estrellas como una forma de representar no solo cualquier tipo, sino algún tipo fijo que no sabes exactamente qué es.
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
String
s, o una lista de
Int
s, o una lista de otra cosa.
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 obtener 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 continuación:
Además,
List<*>
puede contener objetos de cualquier tipo, pero solo ese tipo, por lo que puede contener Strings (pero solo Strings), mientras queList<Any>
puede contener Strings e Integers y demás, todos en la misma lista.