如何理解带有伴生对象的 Kotlin 函数式接口?
How to understand Kotlin Functional Interface with companion object inside?
我想获得一些帮助来理解关于 Http4k org.http4k.core
包
中使用的功能接口的 Kotlin 代码片段
typealias HttpHandler = (Request) -> Response
fun interface Filter : (HttpHandler) -> HttpHandler {
companion object
}
我不明白Filter
界面,尤其是companion object
部分。一个典型的函数式界面是这样的
fun interface IntPredicate {
fun accept(i: Int): Boolean
}
并且您可以创建一个 lambda isEven
val isEven = IntPredicate { it % 2 == 0 }
根据这个简单的例子,接口 Filter
似乎扩展了另一个接口 (HttpHandler) -> HttpHandler
?然后它定义了一个函数签名companion object
?这个对吗? companion object
部分的真正含义是什么?
Filter
extends (HttpHandler) -> HttpHandler
并且函数类型 (HttpHandler) -> HttpHandler
有一个抽象方法(运算符) - invoke
- 隐式声明,如下所示:
operator fun invoke(HttpHandler): HttpHandler
所以是功能接口的功能签名,而不是companion object
。
companion object
的意思就是它一直以来的意思 - companion object 声明。仅从您显示的代码来看,伴生对象可能看起来是空的,它让人想知道它的用途是什么。如果您删除了声明,功能接口仍然会编译,并且可以像表示函数类型的功能接口一样使用 (HttpHandler) -> HttpHandler
.
但是,如果您进一步查看 file,您会发现(至少)在伴随对象上声明了一个扩展函数:
val Filter.Companion.NoOp: Filter get() = Filter { next -> { next(it) } }
例如,这允许您执行 val noOp = Filter.NoOp
,因此伴随对象并非 毫无意义。
我想获得一些帮助来理解关于 Http4k org.http4k.core
包
typealias HttpHandler = (Request) -> Response
fun interface Filter : (HttpHandler) -> HttpHandler {
companion object
}
我不明白Filter
界面,尤其是companion object
部分。一个典型的函数式界面是这样的
fun interface IntPredicate {
fun accept(i: Int): Boolean
}
并且您可以创建一个 lambda isEven
val isEven = IntPredicate { it % 2 == 0 }
根据这个简单的例子,接口 Filter
似乎扩展了另一个接口 (HttpHandler) -> HttpHandler
?然后它定义了一个函数签名companion object
?这个对吗? companion object
部分的真正含义是什么?
Filter
extends (HttpHandler) -> HttpHandler
并且函数类型 (HttpHandler) -> HttpHandler
有一个抽象方法(运算符) - invoke
- 隐式声明,如下所示:
operator fun invoke(HttpHandler): HttpHandler
所以是功能接口的功能签名,而不是companion object
。
companion object
的意思就是它一直以来的意思 - companion object 声明。仅从您显示的代码来看,伴生对象可能看起来是空的,它让人想知道它的用途是什么。如果您删除了声明,功能接口仍然会编译,并且可以像表示函数类型的功能接口一样使用 (HttpHandler) -> HttpHandler
.
但是,如果您进一步查看 file,您会发现(至少)在伴随对象上声明了一个扩展函数:
val Filter.Companion.NoOp: Filter get() = Filter { next -> { next(it) } }
例如,这允许您执行 val noOp = Filter.NoOp
,因此伴随对象并非 毫无意义。