Confused about variance error


#1

I was wondering what was wrong with the following code:

sealed class Maybe<out T> {
    class Some<out T>(val value: T) : Maybe<T>()
    object None : Maybe<Nothing>()
    
    fun or(f: () -> Maybe<T>): Maybe<T> = when (this) {
    //  error:            ^
    // Type parameter T is declared as 'out' but occurs in 'in' position in type () -> Maybe<T>
        is Some<T> -> this
        is None -> f()
    }
}

T is covariance (out) within Maybe. Maybe<T> is covariant within () -> Maybe<T> (it’s the return type). So T is should be covariant (out) within () -> Maybe<T>, not contravariant (in) as the error says!

Or did I miss something?

If you want the intuition: I can get T's out of my Maybe. I can get Maybe<T>'s out of my function. Hence, I can never use that function to obtain something that is not a T or a subclass thereof.

Current fix: use @UnsafeVariance