Avatar ·

Diferencia entre `*` y `Any` en genéricos de Kotlin: asterisco vs Any

¡Hola a todos! Empecé a estudiar Kotlin recientemente y me encontré con un punto confuso en los genéricos. \n\nEn la documentación vi que se puede usar `*` (star projection) en genéricos, y también se puede escribir ``. A primera vista parece que hacen lo mismo: permiten almacenar cualquier tipo en la colección. Pero siento que hay alguna diferencia importante entre ellos.\n\nPor ejemplo, escribo este código:\n\n```kotlin\nval list1: MutableList = mutableListOf("строка", 42, 3.14)\nval list2: MutableList<*> = mutableListOf("строка", 42, 3.14)\n```\n\nAmbas variables funcionan, y puedo agregar cualquier elemento a ellas. Pero si intento leer un elemento y asignarlo a una variable con un tipo específico, surgen rarezas.\n\nSi escribo:\n```kotlin\nval item1: String = list1[0] // ¿Error de compilación? ¿O no?\nval item2: String = list2[0] // ¿Y aquí?\n```\n\nLa primera opción se compila, pero la segunda no. ¿Por qué? ¿Y cuál es la diferencia entre `*` y `Any`? ¿Cuándo usar cada uno? Explíquenlo, por favor.