Scala中的语言特性是如何实现的(2)
上篇博文的末尾留了三个问题,现在自问自答一下。
在Scala中被声明为val的v4为什么在反编译的Java中不是final的呢?
在方法中声明局部变量时,如果用Scala的val关键字(或者是Java中的final)来修饰变量,则代表着此变量在赋过初始值之后不可以再被重新赋值。这个val或者final只是给编译器用的,编译器如果发现你给此变量重新赋值会抛出错误。
而bytecode不具备表达一个局部变量是immutable的能力,也就是说对于JVM来说,不存在不可变的局部变量这个概念。所以v4在反编译之后,就和普通的局部变量无异了。
在Scala中被声明为val的v2为什么在反编译的C#中不是readonly的呢?
这是个挺tricky的问题,我试着解释一下。Scala .NET是基于IKVM实现的,IKVM可以把Java bytecode翻译为CIL。
所以Scala编译为CIL的过程实际是这样的: