4

我想获得一些帮助以了解有关 Http4korg.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
}

你可以创建一个 lambdaisEven

val isEven = IntPredicate { it % 2 == 0 }

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

4

1 回答 1

5

Filterextends(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,因此伴生对象并不是那么毫无意义。

于 2021-08-06T07:09:53.103 回答