我想得到一些帮助,以了解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这个角色到底是什么意思?
发布于 2021-08-06 07:09:53
Filter扩展了(HttpHandler) -> HttpHandler,函数类型(HttpHandler) -> HttpHandler只有一个抽象方法(操作符)-- invoke --隐式声明,如下所示:
operator fun invoke(HttpHandler): HttpHandler这是函数接口的函数签名,而不是companion object。
companion object的意思就是它一直以来的意思-- 伴生对象声明。从您展示的代码来看,同伴对象可能看起来是空的,这让人想知道它的目的是什么。如果您删除了声明,函数接口仍然会被编译,并且可以像函数类型(HttpHandler) -> HttpHandler的函数接口一样使用。
但是,如果深入了解文件,您将看到(至少)在配套对象上声明了一个扩展函数:
val Filter.Companion.NoOp: Filter get() = Filter { next -> { next(it) } }例如,这允许您执行val noOp = Filter.NoOp,因此同伴对象并不是没有意义的。
https://stackoverflow.com/questions/68677131
复制相似问题