以下代码抛出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
甚至在那时定义了?
答案 0 :(得分:6)
因为def
声明了一个由编译器放在类中的方法,所以它一经编译就存在。为了返回一些东西,一个方法必须运行到它实际返回的东西,所以你的第二个例子没有问题。
val
声明一个“不可变值”,虽然它仍然需要初始化,在此之前它保持其类型的默认值 - 在本例中为0.此初始化发生在{的构造函数之后运行{1}},除非您将示例更改为使用早期初始化:
trait T