Scala中最终var的用法是什么?

时间:2013-08-14 02:22:11

标签: scala

Scala中final var的用法是什么?什么是行为。有没有用例?

(另见Why are `private val` and `private final val` different?,非常接近,但不一样)

1 个答案:

答案 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。

编辑:对不起,没有注意到你特意没有问过这件事。孩子们正准备睡觉,刷牙,所有这一切,有点分心。