gpt4 book ai didi

scala - Scala 中的继承和初始化

转载 作者:行者123 更新时间:2023-12-04 19:30:29 28 4
gpt4 key购买 nike

我有两个 Scala 类,如下所示(释义):

abstract class GenericParser[T] {
val lineFilter : String => Boolean

parseData()

def parseData() : T {
for( line <- .... if lineFilter(line) )
// do things
}
}

class SalesParser extends GenericParser[SalesRow] {
val lineFilter = line => !line.startsWith("//")

// ....
}

问题是 lineFilterparseData 中为 null,大概是因为 parseData 在主 code>GenericParser 构造函数仍在运行,因此子类尚未完全初始化其成员。

我可以通过将 lineFilter 设置为 def 而不是 val 来解决此问题,但这是预期的行为吗?这个问题只有在运行时获得 NPE 后才会变得明显,这似乎不太正确。

最佳答案

这确实是预期的行为,并且与此问题完全相同:

Scala 2.8: how to initialize child class

您基本上可以复制粘贴该问题的答案。解决方案包括:

  • deflazy val 而不是 val
  • lineFilter的早期初始化
  • 重新设计您的类,以避免“从父类(super class)的构造函数调用访问未初始化的子类值的虚拟方法”问题。例如,为什么要将过滤器函数存储在 val 中或从 def 返回,而它可以作为方法实现?

    abstract class GenericParser[T] {
    def lineFilter(line: String): Boolean

    parseData()

    def parseData() : T {
    for( line <- .... if lineFilter(line) )
    // do things
    }
    }

    class SalesParser extends GenericParser[SalesRow] {
    def lineFilter(line: String) = !line.startsWith("//")
    }

关于scala - Scala 中的继承和初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5842143/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com