首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何理解Kotlin函数接口中的伴随对象?

如何理解Kotlin函数接口中的伴随对象?
EN

Stack Overflow用户
提问于 2021-08-06 06:32:10
回答 1查看 222关注 0票数 4

我想得到一些帮助,以了解Http4k org.http4k.core包中使用的函数接口的Kotlin代码片段。

代码语言:javascript
复制
typealias HttpHandler = (Request) -> Response

fun interface Filter : (HttpHandler) -> HttpHandler {
    companion object
}

我不理解Filter接口,特别是companion object部分。典型的功能接口如下所示

代码语言:javascript
复制
fun interface IntPredicate {
    fun accept(i: Int): Boolean
}

您可以创建一个lambda isEven

代码语言:javascript
复制
val isEven = IntPredicate { it % 2 == 0 }

根据这个简单的例子,它看起来像接口Filter扩展了另一个接口(HttpHandler) -> HttpHandler?然后定义了一个函数签名companion object?这是正确的吗?companion object这个角色到底是什么意思?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-06 07:09:53

Filter扩展了(HttpHandler) -> HttpHandler,函数类型(HttpHandler) -> HttpHandler只有一个抽象方法(操作符)-- invoke --隐式声明,如下所示:

代码语言:javascript
复制
operator fun invoke(HttpHandler): HttpHandler

这是函数接口的函数签名,而不是companion object

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

但是,如果深入了解文件,您将看到(至少)在配套对象上声明了一个扩展函数:

代码语言:javascript
复制
val Filter.Companion.NoOp: Filter get() = Filter { next -> { next(it) } }

例如,这允许您执行val noOp = Filter.NoOp,因此同伴对象并不是没有意义的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68677131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档