如何理解带有配套对象的 Kotlin 功能接口?

dan*_*nny 4 kotlin functional-interface http4k

我想获得一些帮助,以了解有关 Http4korg.http4k.core包中使用的功能接口的 Kotlin 代码片段

typealias HttpHandler = (Request) -> Response

fun interface Filter : (HttpHandler) -> HttpHandler {
    companion object
}
Run Code Online (Sandbox Code Playgroud)

我不了解Filter界面,尤其是companion object部分。一个典型的功能界面是这样的

fun interface IntPredicate {
    fun accept(i: Int): Boolean
}
Run Code Online (Sandbox Code Playgroud)

你可以创建一个 lambda isEven

val isEven = IntPredicate { it % 2 == 0 }
Run Code Online (Sandbox Code Playgroud)

根据这个简单的例子,看起来接口Filter扩展了另一个接口(HttpHandler) -> HttpHandler?然后它定义了一个函数签名companion object?这样对吗?这部分的companion object真正含义是什么?

Swe*_*per 5

Filterextends(HttpHandler) -> HttpHandler并且函数类型(HttpHandler) -> HttpHandler有一个抽象方法(运算符) - invoke- 隐式声明,如下所示:

operator fun invoke(HttpHandler): HttpHandler
Run Code Online (Sandbox Code Playgroud)

所以是函数接口的函数签名,而不是companion object.

companion object意味着它一直意味着 -伴随对象声明。仅从您展示的代码来看,伴随对象可能看起来是空的,这让人想知道它的目的是什么。如果您删除了声明,函数式接口仍会被编译,并且可以像表示函数类型的函数式接口一样使用(HttpHandler) -> HttpHandler

但是,如果您进一步查看file,您会看到(至少)在伴随对象上声明了一个扩展函数:

val Filter.Companion.NoOp: Filter get() = Filter { next -> { next(it) } }
Run Code Online (Sandbox Code Playgroud)

这允许你这样做val noOp = Filter.NoOp,例如,让同伴对象也不没有意义的。