序列发生器作为扩展函数调用失败与“接收器类型不匹配”

我正在试图从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 */ } 

我明白了

错误:(26,20)Kotlin:未解决的参考。 公共中缀fun Long.join(R:LongRange):在main.kotlin中定义的序列

似乎编译器认识到函数的签名与我正在尝试实现的内容很接近 ,但是我很清楚“接收器类型不匹配”是什么意思。

“接收器类型不匹配”错误意味着作为接收器传递给扩展函数的内容 (即被调用的内容)不符合声明的接收器类型。

与Java不同,Kotlin 不会将数字推广到更广泛的数字类型,并且您必须在您的代码中使用Long文字 (其中需要Long ):

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

在这里,使用2作为接收器不是一个选项,因为一个Int是预期的。 但在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