【问题标题】:Scala trait: val/def and requireScala 特征:val/def 和 require
【发布时间】:2013-11-26 21:14:46
【问题描述】:

以下代码抛出IllegalArgumentException

trait T{
  val x: Long
  require(x > 0)
}

object T extends App{
  val y = new T{ val x = 42L }
}

而以下不是:

trait T{
  def x(): Long
  require(x() > 0)
}

object T extends App{
  val y = new T{ def x() = 42L }
}

这是为什么呢?何时调用require()?为什么val 还要在那个时候定义?

【问题讨论】:

    标签: scala illegalargumentexception


    【解决方案1】:

    因为def声明了一个方法,这个方法是编译器放到类中的,所以一编译就存在。为了返回一些东西,一个方法必须运行到它实际返回一些东西的点,所以你的第二个例子没有问题。

    val 声明了一个“不可变值”,尽管它仍然必须被初始化,在此之前它保存其类型的默认值 - 在本例中为 0。此初始化发生在 trait T 的构造函数之后运行,除非您将示例更改为使用早期初始化:

    val y = new { val x = 42L } with T
    

    【讨论】:

      猜你喜欢
      • 2013-11-07
      • 1970-01-01
      • 2018-10-01
      • 2018-08-15
      • 2011-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多