作为扩展函数调用的序列生成器失败 "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
我正在尝试用 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