Scala初始化行为
请看下面的代码.
trait MyTrait { val myVal : String } class MyClass extends MyTrait { val myVal = "Value" } class MyClass2(val myVal: String) extends MyTrait 为什么MyClass和MyClass2的初始化顺序有所不同? MyClass() { MyTrait$class.$init$(this); myVal = value } MyClass2的构造函数将是 MyClass2(String myVal) { this.myVal = myVal; MyTrait$class.$init$(this) } 我认为初始化顺序应该像MyClass2的构造函数一样,对于这两种情况都是一样的. 解决方法
在
Scala specification第5.1节的末尾,定义如下:
但是请注意,构造函数参数可能由随后的任何构造函数使用.因此,需要在它们之前进行初始化.这在第5.1.1节的末尾是明确的:
这没有任何问题,但是您最后执行的{stats}确实存在问题.最后执行{stats}的原因是它可以引用其祖先类和特征的属性,而祖先显然不了解其后代.因此,在执行{stats}之前,祖先需要完全初始化. 当然,您可能需要提前初始化. 5.1.6:早期定义涵盖了这一点.这是你如何写它: class MyClass extends { val myVal = "Value" } with MyTrait (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |