Sobes.tech
Senior

Que savez-vous du principe de projection stellaire?

sobes.tech IA

Réponse de l'IA

Le principe de projection d’étoiles (Star Projection) en Kotlin est une méthode sûre pour utiliser des génériques lorsque le type précis de l’argument n’est pas important, mais où il faut assurer la sécurité des types.

Il s’applique dans les cas suivants :

  • * : Équivalent à Any?. Indique que le type de l’argument est inconnu et qu’il n’y a pas d’informations sur ses limites. On peut uniquement lire des éléments qui sont des instances de Any?, et on ne peut rien écrire, sauf null.

    // Lecture d’une liste avec un type inconnu
    fun readFromList(list: List<*>) {
        val item: Any? = list.firstOrNull()
        // Peut être lu en toute sécurité comme Any?
    }
    
  • in * : Équivalent à in Nothing. Utilisé pour les types covariants (out), lorsque le type inférieur précis n’est pas important. On peut uniquement ajouter des éléments (type Nothing, ce qui est impossible), mais pas lire.

    // Impossible d’ajouter en toute sécurité des éléments à une liste avec un type covariant
    fun addToList(list: MutableList<out *>) {
        // list.add(...) // ne compile pas
    }
    
  • out * : Équivalent à out Any?. Utilisé pour les types contravariants (in), lorsque le type supérieur précis n’est pas important. On peut uniquement lire des éléments (comme Any?), mais pas écrire.

    // Lecture d’un comparateur avec un type contravariant
    fun compare(comparator: Comparator<in *>) {
        // Peut appeler des méthodes qui N’acceptent PAS le type T
        // comparator.compare(obj1, obj2) // ne compile pas sans conversion de type
    }
    

L’objectif principal des projections d’étoiles est une interaction sûre avec des classes et fonctions génériques lorsque le type complet de l’argument est inconnu ou non pertinent pour l’opération en cours. Cela aide à éviter les castings non sécurisés et à maintenir la sécurité des types.

Exemples d’utilisation :

  • Travailler avec des collections où seul le fait de posséder des éléments est important, mais pas leur type précis.
  • Conversion de types pour des objets génériques.
  • Interopérabilité avec du code Java utilisant des types bruts.