Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sequence generator as extension function call fails with "receiver type mismatch"

I'm playing around with trying to generate a sequence out of a single Long value prepended to a LongRange. This works:

val seq = buildSequence<Long> {
    yield(2)
    yieldAll(3L..5)
}

But trying to generalize it, I can't seem to structure an extension function that I can call successfully:

infix fun Long.join(R: LongRange): Sequence<Long> {
    val start = this
    return buildSequence<Long> {
        yield(start)
        yieldAll(R)
    }
}

When I attempt to call it:

(2 join 3..5).forEach { /* do something */ }

I get

Error:(26, 20) Kotlin: Unresolved reference. None of the following candidates is applicable because of receiver type mismatch: public infix fun Long.join(R: LongRange): Sequence defined in main.kotlin

It seems as though the compiler recognizes that the signature of the function is close to what I'm trying to achieve, but I'm clearly fuzzy on what "receiver type mismatch" means.

like image 986
Tim Keating Avatar asked May 18 '17 20:05

Tim Keating


1 Answers

The 'receiver type mismatch' error means that what is passed as a receiver to the extension function (i.e. what it is called on) does not correspond to the declared receiver type.

Kotlin, unlike Java, doesn't promote numbers to broader numeric types, and you have to use Long literals in your code where a Long is expected:

(2L join 3L..5).forEach { /* do something */ }

Here, using 2 as a receiver is not an option because a Long is expected. But in 3L..5 using 5 is OK because there is a Long.rangeTo overload that accepts an Int and returns a LongRange.


The only exception when there is an automatic promotion is when you assign an Int literal into a variable of another integral type and when you pass an Int literal as an argument to a function that expects another integral type (as said above, it doesn't work with receivers).

val a: Long = 5 // OK

fun f(l: Long) { }
f(5)            // OK

val b = 5
val c: Long = b // Error
f(b)            // Error
like image 78
hotkey Avatar answered Nov 01 '22 13:11

hotkey