4

final varScala中的 a 有什么用?是什么行为。有没有用例?

(另请参阅,为什么 `private val` 和 `private final val` 不同?,非常接近,但不一样)

4

1 回答 1

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 修饰符适用于类成员定义和类定义。最终的类成员定义不能在子类中被覆盖。final 类不能被模板继承。final 对于对象定义是多余的。final 类或对象的成员也是隐式的 final,因此 final 修饰符通常对它们来说也是多余的。但是请注意,常量值定义(第 4.1 节)确实需要显式的 final 修饰符,即使它们是在 final 类或对象中定义的。final 不能应用于不完整的成员,并且不能与sealed 组合在一个修饰符列表中。

和 4.1

常量值定义的形式为

final val x = e

其中 e 是一个常量表达式(第 6.24 节)。final 修饰符必须存在,并且不能给出类型注释。对常量值 x 的引用本身被视为常量表达式;在生成的代码中,它们被定义的右侧 e 替换。

编辑:对不起,没有注意到你特别没有问这个问题。孩子们正在准备睡觉,刷牙等等,有点分心。

于 2013-08-14T04:13:55.133 回答