Sobes.tech
Senior

What do you know about the star projection principle?

sobes.tech AI

Answer from AI

The principle of star projection (Star Projection) in Kotlin is a way to safely use generics when the specific type of the argument is not important, but type safety must be ensured.

It is used in the following cases:

  • *: Equivalent to Any?. Indicates that the type of the argument is unknown and there is no information about its bounds. You can only read elements that are instances of Any?, and cannot write any, except null.

    // Reading from a list with an unknown type
    fun readFromList(list: List<*>) {
        val item: Any? = list.firstOrNull()
        // Safe to read as Any?
    }
    
  • in *: Equivalent to in Nothing. Used for covariant types (out), when the specific lower type is not important. You can only write elements (of type Nothing, which is impossible), but cannot read.

    // Impossible to safely add elements to a covariant list
    fun addToList(list: MutableList<out *>) {
        // list.add(...) // Will not compile
    }
    
  • out *: Equivalent to out Any?. Used for contravariant types (in), when the specific upper type is not important. You can only read elements (as Any?), but cannot write.

    // Reading from a comparator with contravariant type
    fun compare(comparator: Comparator<in *>) {
        // Can call methods that do NOT accept type T
        // comparator.compare(obj1, obj2) // Will not compile without type casting
    }
    

The main purpose of star projections is safe interaction with generic classes and functions when the full type of the argument is unknown or irrelevant for the current operation. This helps avoid unsafe casts and maintain type safety.

Examples of usage:

  • Working with collections where only the fact of the presence of elements is important, but not their specific type.
  • Casting types for generic objects.
  • Interoperability with Java code using raw types.
What do you know about the star projection principle… - sobes.tech