加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala继承问题:val与def

发布时间:2020-12-16 08:49:50 所属栏目:安全 来源:网络整理
导读:从Odersky的书中写一个简单的例子导致了以下问题: // AbstractElement.scalaabstract class AbstractElement { val contents: Array[String] val height: Int = contents.length // line 3}class UnifiedElement(ch: Char,_width: Int,_height: Int) extend
从Odersky的书中写一个简单的例子导致了以下问题:

// AbstractElement.scala
abstract class AbstractElement {
  val contents: Array[String]
  val height: Int = contents.length // line 3
}

class UnifiedElement(ch: Char,_width: Int,_height: Int) extends AbstractElement { // line 6
  val contents = Array.fill(_height)(ch.toString() * _width)
}

object AbstractElement {
  def create(ch: Char): AbstractElement = {
    new UnifiedElement(ch,1,1) // line 12
  }
}

,

// ElementApp.scala
import AbstractElement.create

object ElementApp {

  def main(args: Array[String]): Unit = {
  val e1 = create(' ') // line 6
    println(e1.height)
  }
}

编译器抛出以下跟踪:

Exception in thread "main" java.lang.NullPointerException
    at AbstractElement.<init>(AbstractElement.scala:3)
    at UnifiedElement.<init>(AbstractElement.scala:6)
    at AbstractElement$.create(AbstractElement.scala:12)
    at ElementApp$.main(ElementApp.scala:6)
    at ElementApp.main(ElementApp.scala)

所以编译器认为内容仍为null,但我在UnifiedContainer中定义了它!

当我用def替换val并且evrth工作完美时,事情变得更加奇怪!

你能解释一下这种行为吗?

解决方法

Here是Paul P的一篇很棒的文章,解释了Scala中的初始化顺序错综复杂.根据经验,你绝不应该使用抽象的val.始终使用抽象defs和lazy vals.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读