Avatar ·

Diferença entre `*` e `Any` em genéricos Kotlin: asterisco vs Any

Olá a todos! Comecei a estudar Kotlin recentemente e me deparei com um ponto confuso em genéricos. \n\nNa documentação, vi que é possível usar `*` (star projection) em genéricos, e também escrever ``. À primeira vista, parece que eles fazem a mesma coisa — permitem armazenar qualquer tipo na coleção. Mas sinto que há alguma diferença importante entre eles.\n\nPor exemplo, escrevo este código:\n\n```kotlin\nval list1: MutableList = mutableListOf("string", 42, 3.14)\nval list2: MutableList<*> = mutableListOf("string", 42, 3.14)\n```\n\nAmbas as variáveis funcionam, e posso adicionar qualquer elemento nelas. Mas se eu tentar ler um elemento e atribuí-lo a uma variável com tipo específico, surgem estranhezas.\n\nSe escrevo:\n```kotlin\nval item1: String = list1[0] // Erro de compilação? Ou não?\nval item2: String = list2[0] // E aqui?\n```\n\nA primeira opção compila, mas a segunda não. Por que isso? E qual é a diferença entre `*` e `Any`? Quando usar cada um? Expliquem, por favor.