提问人:Langua 提问时间:9/30/2021 更新时间:9/30/2021 访问量:100
创建 Kotlin 中缀表示法以将一个函数嵌套到另一个函数时,类型不匹配
type mismatch when create a kotlin infix notation to nest a function to another
问:
我正在尝试创建一个中缀符号作为函数的扩展函数,用于将一个函数嵌套到另一个函数。
例如:(Int) -> Int
class Entry {
companion object {
private fun f(x: Int) = x * 2
private fun g(x: Int) = x + 2
private infix fun ((Int) -> Int).nest(inner: (Int) -> Int) = { x: Int -> this(inner(x)) }
@JvmStatic
fun main(args: Array<String>) {
val func = ::f nest ::g
println(func(10))
}
}
}
这段代码工作正常,它创建了一个中缀表示法作为扩展函数来发挥作用。它需要另一个函数并将它们嵌套在一起。
等于
等于 。nest
(Int) -> Int
(Int) -> Int
val func = ::f nest ::g
val fun func(x:Int) = f(g(x))
func(10)
(10 + 2) * 2
但是当我尝试将此扩展符号函数扩展到接口(用于支持各种数字)时,我遇到了一个问题。
例如:Number
class Entry {
companion object {
private fun f(x: Int) = x * 2
private fun g(x: Int) = x + 2
private infix fun ((Number) -> Number).nest(inner: (Number) -> Number) = { x: Number -> this(inner(x)) }
// only the infix fun declaration changed ^
@JvmStatic
fun main(args: Array<String>) {
val func = ::f nest ::g
println(func(10))
}
}
}
kotlin 编译器抛出错误。
Kotlin: Unresolved reference. None of the following candidates is applicable because of receiver type mismatch:
private final infix fun ((Number) -> Number).nest(inner: (Number) -> Number): (Number) -> Number defined in ...(path of class Entry)
我想知道为什么从 延伸,但与 不匹配。
如果我想将此表示法函数扩展到所有请求数字并返回数字的函数(例如等),我应该怎么做?Int
Number
(Int) -> Int
(Number) -> Number
(Long) -> Long
(Float) -> Double
答:
请注意,a 不是一种 .也就是说,你可以把 any 给 a ,但你只能把 s 传递给 a 。(Int) -> Int
(Number) -> Number
Number
(Number) -> Number
Int
(Int) -> Int
按照你的逻辑,我可以用一个,因为也是一个(按照你的逻辑),但这肯定没有意义,不是吗?您不能将 a 传递给 .nest
(Int) -> Int
(Double) -> Double
(Double) -> Double
(Number) -> Number
Double
(Int) -> Int
您的函数可以更通用地使用泛型编写:nest
infix fun <T, U, V> ((U) -> V).nest(inner: (T) -> U) = { x: T -> this(inner(x)) }
可以嵌套任何 ,产生 .(U) -> V
(T) -> U
(T) -> V
评论