序列生成器作为扩展函数调用失败,"接收器类型不匹配"

Tim*_*ing 5 generator coroutine kotlin

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

val seq = buildSequence<Long> {
    yield(2)
    yieldAll(3L..5)
}
Run Code Online (Sandbox Code Playgroud)

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

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

当我试图打电话时:

(2 join 3..5).forEach { /* do something */ }
Run Code Online (Sandbox Code Playgroud)

我明白了

错误:(26,20)Kotlin:未解决的参考.由于接收器类型不匹配,以下候选者都不适用:公共中缀乐趣Long.join(R:LongRange):在main.kotlin中定义的序列

好像编译器认识到函数的签名接近我想要实现的那个,但我对"接收器类型不匹配"的含义显然很模糊.

hot*_*key 6

"接收器类型不匹配"的错误意味着什么作为接收器的扩展功能通过(即是什么所谓的)不符合申报接收器类型.

科特林,不像Java的,不提倡的数字更广泛的数字类型,你必须用Long文字在你的代码,其中一个Long预期:

(2L join 3L..5).forEach { /* do something */ }
Run Code Online (Sandbox Code Playgroud)

在这里,使用2接收器不是一种选择,因为a Long是预期的.但是在3L..5使用中5是可以的,因为有一个Long.rangeTo重载接受Int并返回一个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
Run Code Online (Sandbox Code Playgroud)