假设我们进行了以下设置:
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/