看下面的代码:
abstract class A {
init {
f()
}
abstract fun f()
}
class B(val p: () -> Unit) : A() {
override fun f() {
try {
p()
} catch (c: Throwable) {
println(c)
}
}
}
val b = B {
println("p() called")
}
预计会打印
p() called
,实际结果是NPE:
java.lang.NullPointerException: Cannot invoke "kotlin.jvm.functions.Function0.invoke()" because "this.p" is null
您能否解释一下,为什么我无法从父构造函数访问子构造函数参数?我该如何处理这个问题?
类的超类部分必须在子类中定义的额外内容之前完全构建。因此,您绝不能从构造函数中调用任何开放/抽象函数或属性,因为它们可能引用尚未初始化的事物。
为了能够在超类构造函数中调用此函数,您需要将其作为超类中的构造函数参数。子类可以将其传递给超类。
但是这个例子可能太笼统了,无法真正为你想要做的事情提出一个适用的替代方案。