构造函数参数为 null,直到父级未初始化

问题描述 投票:0回答:1

看下面的代码:

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

您能否解释一下,为什么我无法从父构造函数访问子构造函数参数?我该如何处理这个问题?

kotlin oop inheritance constructor nullpointerexception
1个回答
0
投票

类的超类部分必须在子类中定义的额外内容之前完全构建。因此,您绝不能从构造函数中调用任何开放/抽象函数或属性,因为它们可能引用尚未初始化的事物。

为了能够在超类构造函数中调用此函数,您需要将其作为超类中的构造函数参数。子类可以将其传递给超类。

但是这个例子可能太笼统了,无法真正为你想要做的事情提出一个适用的替代方案。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.