为什么 Kotlin 的内置 "lazy" 函数真的有效?

How come Kotlin's built-in "lazy" function actually works?

我想在我的 Kotlin 代码中尝试一些新的委托属性。我在文档中发现,对于自定义委托属性,我需要使用强制方法创建 class - getValue 和可选的 setValue,它们是文档中提到的接口的一部分:

You can create delegates as anonymous objects without creating new classes using the interfaces ReadOnlyProperty and ReadWriteProperty from the Kotlin standard library

我开始研究 Kotlin 的内置委托函数。我研究了 lazy 函数的实现,如下所示:

public actual fun <T> lazy(initializer: () -> T): Lazy<T> = SynchronizedLazyImpl(initializer)

这就是我的问题所在:为什么它真的有效? Lazy 接口只有 value 属性 和一些方法确定它的值的初始化。 SynchronizedLazyImpl 仅此而已。 None 其中有 getValuesetValue 方法,那么为什么 Kotlin 不报错并编译成功?

查看 Lazy here 的源代码,您可以在第 37 行看到以下内容:

/**
 * An extension to delegate a read-only property of type [T] to an instance of [Lazy].
 *
 * This extension allows to use instances of Lazy for property delegation:
 * `val property: String by lazy { initializer }`
 */
@kotlin.internal.InlineOnly
public inline operator fun <T> Lazy<T>.getValue(thisRef: Any?, property: KProperty<*>): T = value

本质上,Lazy 实例有一个 getValue 扩展函数,只是 returns value 属性。 SynchronizedLazyImpl只是定义了value属性,getValue是自动提供的。