作为扩展函数调用的序列生成器失败 "receiver type mismatch"

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

我正在尝试用 LongRange 前面的单个 Long 值生成一个序列。这有效:

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

但是试图概括它,我似乎无法构造一个我可以成功调用的扩展函数:

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

当我尝试调用它时:

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

我明白了

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

似乎编译器识别出函数的签名接近我想要实现的目标,但我显然不清楚[=29] =] 表示.

'receiver type mismatch' 错误意味着 passed as a receiver to the extension function(即调用它的对象)与声明的接收器类型不对应。

Kotlin,与代码中的 Java、doesn't promote numbers to broader numeric types, and you have to use Long literals 不同,其中需要 Long

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

在这里,使用 2 作为接收者不是一个选项,因为 Long 是预期的。但是在 3L..5 中使用 5 是可以的,因为有一个 Long.rangeTo 重载接受 Int 和 returns 一个 LongRange.


存在 自动提升时的唯一例外是当您将 Int 文字分配给另一个整数类型的变量时以及当您传递 Int 文字作为函数的参数,该函数需要另一种整数类型(如上所述,它不适用于接收器)。

val a: Long = 5 // OK

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

val b = 5
val c: Long = b // Error
f(b)            // Error