序列发生器作为扩展函数调用失败与“接收器类型不匹配”
我正在试图从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