Scala中final var
的用法是什么?什么是行为。有没有用例?
(另见Why are `private val` and `private final val` different?,非常接近,但不一样)
答案 0 :(得分:9)
final
意味着重载。
这可能意味着“无法覆盖子类”,因此final var
。
apm@mara:~$ skala -Yoverride-vars
Welcome to Scala version 2.11.0-20130811-132927-95a4d6e987 (OpenJDK 64-Bit Server VM, Java 1.7.0_25).
Type in expressions to have them evaluated.
Type :help for more information.
scala> trait Foo { var v = 7 }
defined trait Foo
scala> trait Bar extends Foo { override var v = 8 }
defined trait Bar
scala> trait Foo { final var v = 7 }
defined trait Foo
scala> trait Bar extends Foo { override var v = 8 }
<console>:8: error: overriding variable v in class Foo$class of type Int;
variable v cannot override final member
trait Bar extends Foo { override var v = 8 }
^
final val i = 7
是一个常量值定义(也称为编译时间常量),但val i = 7
不是,无论访问修饰符如何。
之前曾引用过这个,但规格为5.2:
final修饰符适用于类成员定义和类 定义。最终的类成员定义可能不会被覆盖 在子类中。最终的类可能不会被模板继承。最后 对于对象定义来说是多余的。最终班级成员或 对象也是最终的,所以最终修饰符通常是 对他们来说也是多余的。但请注意,该值为常数 定义(第4.1节)确实需要一个明确的最终修饰符,即使它们也是如此 在最终的类或对象中定义。最终可能不适用于 不完整的成员,它可能不会合并在一个修饰符列表中 密封的。
和4.1
常量值定义的格式为
final val x = e
编辑:对不起,没有注意到你特意没有问过这件事。孩子们正准备睡觉,刷牙,所有这一切,有点分心。其中e是常数表达式(§6.24)。最终修饰符必须是 目前并没有给出类型注释。参考文献 常量值x本身被视为常量表达式;在 生成的代码由定义的右手替换 方e。