Kotlin:child class 如何在超级构造函数调用中使用 parent 的扩展函数?

Kotlin: How can a child class use a parent's extension function in the super constructor call?

child class 如何在 lambda 字段中使用其 parent 的扩展函数?

考虑这个 parent class:

abstract class Parent(val field: Int.() -> Any) { 
    fun Int.print() = println(this) 
}

还有这个child:

class Child : Parent({
    print() // DOESN'T COMPILE
    this.print() // DOESN'T COMPILE

    5.print() // DOESN'T COMPILE

    val value = 5
    value.print() // DOESN'T COMPILE
})

在您的示例中,有问题的 lambda 不是 Parent 的字段(严格来说),而是函数的参数(class 构造函数)。

在创建任何对象 ChildParent 之前构造(解析)lambda。这就是为什么可以解析方法并且lambda不在Child.

范围内的原因

PS

题名提示如下情况,编译正常:

class Child : Parent({}) {
    val lambdaField: Int.() -> Any =  {
        print()
        this.print()
        5.print()
    }
}

之所以不能在 Child super constructor call 参数中使用 Parent 的扩展是因为它的 Parent 部分不是此时尚未初始化,因此不能用作扩展的 dispatch receiver

Member extension functions 可以使用 eclosing class' 成员,这意味着它们需要 class 的实例来调用,并且您不能在其自己的实例中使用该实例构造函数参数。

否则,您可以在 Child 成员和构造函数(或 init 块)中的任何位置使用 Parent 的扩展,因为超级构造函数在自己的构造函数之前被调用:

class Child : Parent {
    constructor(): super({}) {
        5.print()
    }

    fun f() {
        5.print()
    }

    val g: (Int) -> Unit = { it.print() }
}