Sobes.tech
Senior

O que você sabe sobre o princípio da projeção estelar?

sobes.tech IA

Resposta da IA

O princípio de projeção de estrelas (Star Projection) em Kotlin é uma forma segura de usar genéricos quando o tipo específico do argumento não é importante, mas é necessário garantir a segurança de tipos.

Aplica-se nos seguintes casos:

  • * : Equivale a Any?. Indica que o tipo do argumento é desconhecido e não há informações sobre seus limites. Pode-se apenas ler elementos que sejam instâncias de Any?, e não se pode escrever nenhum, exceto null.

    // Leitura de uma lista com tipo desconhecido
    fun readFromList(list: List<*>) {
        val item: Any? = list.firstOrNull()
        // Pode-se ler com segurança como Any?
    }
    
  • in * : Equivale a in Nothing. Usado para tipos covariantes (out), quando o tipo inferior específico não importa. Pode-se apenas adicionar elementos (tipo Nothing, o que é impossível), mas não pode-se ler.

    // Impossível adicionar elementos de forma segura a uma lista com tipo covariante
    fun addToList(list: MutableList<out *>) {
        // list.add(...) // Não compila
    }
    
  • out * : Equivale a out Any?. Usado para tipos contravariantes (in), quando o tipo superior específico não importa. Pode-se apenas ler elementos (como Any?), mas não escrever.

    // Leitura de um comparador com tipo contravariante
    fun compare(comparator: Comparator<in *>) {
        // Pode chamar métodos que NÃO aceitam o tipo T
        // comparator.compare(obj1, obj2) // Não compilará sem conversão de tipos
    }
    

O objetivo principal das projeções de estrelas é a interação segura com classes e funções genéricas quando o tipo completo do argumento é desconhecido ou não relevante para a operação atual. Isso ajuda a evitar casts inseguros e a manter a segurança de tipos.

Exemplos de uso:

  • Trabalhar com coleções onde apenas a existência de elementos importa, mas não seu tipo específico.
  • Conversão de tipos para objetos genéricos.
  • Interoperabilidade com código Java que usa tipos brutos.