创建 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
不匹配。
如果我想把这个记法函数扩展到所有求一个数和returns一个数的函数(比如(Long) -> Long
(Float) -> Double
等),怎么办?
请注意 (Int) -> Int
是 而不是 的一种 (Number) -> Number
。即,您可以将任何 Number
传递给 (Number) -> Number
,但您只能将 Int
传递给 (Int) -> Int
.
按照你的逻辑,我可以 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
.
我正在尝试创建一个中缀表示法作为 (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
不匹配。
如果我想把这个记法函数扩展到所有求一个数和returns一个数的函数(比如(Long) -> Long
(Float) -> Double
等),怎么办?
请注意 (Int) -> Int
是 而不是 的一种 (Number) -> Number
。即,您可以将任何 Number
传递给 (Number) -> Number
,但您只能将 Int
传递给 (Int) -> Int
.
按照你的逻辑,我可以 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
.