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 }
核心疑问解答
::Food引用的是什么::Food是Food类的构造函数引用,它的类型是Function2<Int, ()->Unit, Food>——对应构造函数的参数列表(Int类型的size、() -> Unit类型的doSomething)和返回值(Food实例)。它指向的是创建Food对象的构造逻辑,而非Food类的某个实例。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
相关产品推荐
相关产品推荐

