Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Scala中重写val遇到DelayedInit时的奇怪初始化_Scala_Init - Fatal编程技术网

在Scala中重写val遇到DelayedInit时的奇怪初始化

在Scala中重写val遇到DelayedInit时的奇怪初始化,scala,init,Scala,Init,下面代码的输出让我感到困惑 代码 输出 尝试了scala 2.10.2和2.11.0-M3 在我的理解中,Test1应该与Test2相同。这里有两个问题: 为什么在Test1.C中它被调用了两次?在类层次结构中没有其他类继承该特性 为什么Test1.C中的s==null 为什么在Test1.C中它被调用了两次?在类层次结构中没有其他类继承该特性 这看起来像个bug,请尝试向Scala JIRA报告 为什么Test1.C中的s==null 我认为这是因为val在 override val s

下面代码的输出让我感到困惑

代码 输出 尝试了scala 2.10.2和2.11.0-M3

在我的理解中,Test1应该与Test2相同。这里有两个问题:

  • 为什么在Test1.C中它被调用了两次?在类层次结构中没有其他类继承该特性
  • 为什么Test1.C中的
    s==null
为什么在Test1.C中它被调用了两次?在类层次结构中没有其他类继承该特性

这看起来像个bug,请尝试向Scala JIRA报告


为什么
Test1.C
中的
s==null

我认为这是因为
val

override val s: String = "C"
由内部变量支持,该变量在
C
的初始化过程中初始化。由于
DelayedInit
不捕获
trait
s,因此
A
的初始化在
DelayedInit
之前执行,即在
C
val s
初始化之前执行


(如果有人发布这些类的反编译Java代码,那会很有趣。)

谢谢你的建议。我只是为它放了一只虫子
Test1
-- new B begin
s = A
B 11111111111111111111111111111111111111111111111111111111111111111111111111111111
new B context
B 22222222222222222222222222222222222222222222222222222222222222222222222222222222
-- new B end
-- new C begin
s = null
C 11111111111111111111111111111111111111111111111111111111111111111111111111111111
C 22222222222222222222222222222222222222222222222222222222222222222222222222222222
C 11111111111111111111111111111111111111111111111111111111111111111111111111111111
new C context
C 22222222222222222222222222222222222222222222222222222222222222222222222222222222
-- new C end
Test2
-- new B begin
s = A
B 11111111111111111111111111111111111111111111111111111111111111111111111111111111
new B context
B 22222222222222222222222222222222222222222222222222222222222222222222222222222222
-- new B end
-- new C begin
s = C
C 11111111111111111111111111111111111111111111111111111111111111111111111111111111
new C context
C 22222222222222222222222222222222222222222222222222222222222222222222222222222222
-- new C end
override val s: String = "C"