【发布时间】:2012-08-31 19:21:29
【问题描述】:
vals 不是(?)在单例对象中自动成为 final 的原因是什么?例如
object NonFinal {
val a = 0
val b = 1
def test(i: Int) = (i: @annotation.switch) match {
case `a` => true
case `b` => false
}
}
结果:
<console>:12: error: could not emit switch for @switch annotated match
def test(i: Int) = (i: @annotation.switch) match {
^
而
object Final {
final val a = 0
final val b = 1
def test(i: Int) = (i: @annotation.switch) match {
case `a` => true
case `b` => false
}
}
编译时没有警告,因此可能会生成更快的模式匹配表。
必须添加final 对我来说似乎是纯粹的烦人噪音。 object 本身不是最终的,因此也是它的成员?
【问题讨论】:
-
嗯。可能使用的特征呢?
-
@TonyK。 - 你的意思是?即使我有
trait T { def a: Int },该对象也会在线性化规则中覆盖a。如果我有trait T { def a: Int = 33 },那么在这种情况下override final val是不可能的。但我认为这仍然不会取消使 non-overriding 默认为 final 的方法。 -
同意。我对 Scala 比较陌生...正在尝试探索您没有想到的可能途径。
-
您应该将接受的答案更改为@extempore (Paul Phillips)。在这种情况下,
final导致在编译期间内联值。