子类如何在lambda字段中使用其父类的扩展功能?
考虑这个父类:
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
})
最佳答案
您不能在Parent
super 构造函数调用参数内使用Child
的扩展名的原因是,此时尚未对其Parent
部分进行初始化,因此不能用作扩展名的派发接收器。
Member extension functions可以使用结束类的成员,这意味着它们需要与之一起使用的类的实例,并且您不能在其自己的构造函数参数中使用该实例。
否则,您可以在Parent
成员内部和构造函数(或Child
块)中的任何地方使用init
的扩展名,因为在自己的构造函数之前调用了 super 构造函数:
class Child : Parent {
constructor(): super({}) {
5.print()
}
fun f() {
5.print()
}
val g: (Int) -> Unit = { it.print() }
}
关于parent-child - Kotlin:子类如何在 super 构造函数调用中使用父类的扩展功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37131406/