kotlin - 当变量用于父类(super class)的初始化时,重写变量会创建 NPE

标签 kotlin

假设我们进行了以下设置:

open class Foo(open val img: Image) {
    val use = img.graphics
}
class Bar(override val img: BufferedImage) : Foo(img)

在初始化时,使用 img.width 创建一个 NPE。我认为问题是,显然即使 img 直接在 Bar 中传递到 Foo 的构造函数中,当它在 Foo 中使用时它并没有指向它,而是指向Bar 类中的重写变量。我怎样才能避免这种情况?

最佳答案

此行为是由于 img 的 getter 被覆盖并返回不同字段的值(因为 Bar 覆盖 img > 使用不同的类型,需要创建一个 BufferedImage 类型的附加字段)。 Foo 构造函数在 Bar 中分配该字段之前执行。

一般来说,您应该避免在类的初始化逻辑中使用开放成员,因为它们可能会在子类中被覆盖,并且可能依赖于某些在父类(super class)初始化时尚未正确初始化的状态。

对于您的特定情况,请将 Foo 构造函数中的 img 设为一个简单参数并显式使用该参数:

open class Foo(img: Image) {
    open val img = img
    val use = img.graphics
}

关于kotlin - 当变量用于父类(super class)的初始化时,重写变量会创建 NPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46132953/

相关文章:

android - 打开某些 fragment 时如何隐藏/显示工具栏上的图标

Kotlin 。我可以获得所有实现特定接口(interface)的对象吗

java - 使用变量进行 Kotlin 元编程

python - 我们可以集成 POLQA(感知客观听力质量评估)来检查通话语音质量吗?

java - 在 Kotlin 中实现 (/inherit/~extend) 注解

java - 如何在 Spring Boot 中从服务器任意发送到 STOMP 端点

kotlin - TeamCity Kotlin DSL 中元运行器的替代品是什么?

android - 忽略这些 kotlin 的 proguard 注释是否安全?

android - 我们在 compose 中有 animateStringAsState 吗?

android - 如何在kotlin中通过蓝牙接收字符串