You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中::Food引用是什么?调用x.invoke为何未触发类中invoke方法?

Kotlin构造函数引用与invoke调用疑问

先看代码示例:

class Food(var size: Int, val doSomething: () -> Unit) {
    init {
        var t = 0
    }

    operator fun invoke() {
        doSomething()
    }
}

var x = ::Food
x.invoke(10) {
    var x = 1
}

核心疑问解答

  1. ::Food引用的是什么
    ::Food是Food类的构造函数引用,它的类型是Function2<Int, ()->Unit, Food>——对应构造函数的参数列表(Int类型的size、() -> Unit类型的doSomething)和返回值(Food实例)。它指向的是创建Food对象的构造逻辑,而非Food类的某个实例。

  2. x.invoke实际调用的是什么
    你猜的没错,x.invoke(10) {}调用的是Kotlin为函数引用内置的invoke方法,不是你在Food类里定义的operator fun invoke()。

因为x的类型是构造函数引用,本质属于Kotlin的函数类型对象,所有函数类型都实现了标准库的Function系列接口,这些接口自带invoke方法。调用这个invoke就等同于直接调用构造函数,只会执行构造相关逻辑(包括init块),和Food实例自身的invoke方法完全无关。

如果要触发Food类里定义的invoke,得先创建实例再调用:

val food = x(10) { var x = 1 }
food() // 因为是operator修饰,可直接用()调用,等价于food.invoke()

内容的提问来源于stack exchange,提问作者Johann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 21:20:26