Sobes.tech
Senior

Wat weet je over het principe van de sterprojectie?

sobes.tech AI

Antwoord van AI

Het principe van sterprojectie (Star Projection) in Kotlin is een veilige manier om generics te gebruiken wanneer het specifieke type van het argument niet belangrijk is, maar het typeveiligheid moet worden gewaarborgd.

Het wordt toegepast in de volgende gevallen:

  • * : Komt overeen met Any?. Geeft aan dat het type argument onbekend is en dat er geen informatie is over de grenzen ervan. Alleen elementen die instanties zijn van Any? kunnen worden gelezen, en er kan niets worden geschreven, behalve null.

    // Lezen uit een lijst met een onbekend type
    fun readFromList(list: List<*>) {
        val item: Any? = list.firstOrNull()
        // Kan veilig worden gelezen als Any?
    }
    
  • in * : Komt overeen met in Nothing. Wordt gebruikt voor covariante types (out), wanneer het specifieke onderliggende type niet belangrijk is. Alleen elementen kunnen worden toegevoegd (type Nothing, wat onmogelijk is), maar niet worden gelezen.

    // Het is onmogelijk om veilig elementen toe te voegen aan een covariante lijst
    fun addToList(list: MutableList<out *>) {
        // list.add(...) // Zal niet compileren
    }
    
  • out * : Komt overeen met out Any?. Wordt gebruikt voor contravariante types (in), wanneer het specifieke bovenliggende type niet belangrijk is. Alleen elementen kunnen worden gelezen (zoals Any?), maar niet worden geschreven.

    // Lezen uit een comparator met contravariante type
    fun compare(comparator: Comparator<in *>) {
        // Methoden kunnen worden aangeroepen die NIET het type T accepteren
        // comparator.compare(obj1, obj2) // Zal niet compileren zonder typeconversie
    }
    

Het hoofddoel van sterprojecties is veilige interactie met generieke klassen en functies wanneer het volledige type van het argument onbekend is of niet relevant voor de huidige operatie. Dit helpt onveilige casts te voorkomen en de typeveiligheid te behouden.

Voorbeelden van gebruik:

  • Werken met collecties waarbij alleen het bestaan van elementen belangrijk is, maar niet het specifieke type.
  • Typeconversies voor generieke objecten.
  • Interoperabiliteit met Java-code die raw types gebruikt.