scala – val是如何不可变的?
发布时间:2020-12-16 09:51:33 所属栏目:安全 来源:网络整理
导读:我知道val不是final,除非明确声明,并且使用 javap确认 Scalac没有插入final到字节码. 因为编译器阻止我们编写任何试图改变它的代码,所以val是不可变的吗? 解决方法 最终和不变性是两个正交的概念: val意味着你不能通过在初始声明后为它赋予任何东西来改变(
我知道val不是final,除非明确声明,并且使用
javap确认
Scalac没有插入final到字节码.
因为编译器阻止我们编写任何试图改变它的代码,所以val是不可变的吗? 解决方法
最终和不变性是两个正交的概念:
val意味着你不能通过在初始声明后为它赋予任何东西来改变(变异)变量: val x = 1 x = 2 // error: reassignment to val 在JVM字节码中,它是通过创建私有成员和getter来实现的,但不是setter: class A { val x = 1 } => // Java equivalent of a generated bytecode public class A { private final int x; public int x() { return x; } ... } final意味着你不能在子类中覆盖你的val: class A { final val x = 1 } class B extends A { override val x = 2 } // error: overriding value x in class A of type Int(1); // value x cannot override final member 如果使用var而不是val,final将导致相同的错误. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |