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 构造函数)。
在创建任何对象 Child
或 Parent
之前构造(解析)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() }
}
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 构造函数)。
在创建任何对象 Child
或 Parent
之前构造(解析)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() }
}