如何理解带有伴生对象的 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,因此伴随对象并非 毫无意义。