In Scala, difference between final val and val [duplicate]

筅森魡賤 提交于 2019-12-18 10:59:16

问题


In Scala, what is the difference between

val a = 1

and

final val fa = 1

回答1:


final members cannot be overridden, say, in a sub-class or trait.

Legal:

class A {
    val a = 1
}

class B extends A {
    override val a = 2
}

Illegal:

class A {
    final val a = 1
}

class B extends A {
    override val a = 2
}

You'll get an error such as this:

:9: error: overriding value a in class A of type Int(1);

value a cannot override final member




回答2:


In Scala, final declares that a member may not be overridden in subclasses. For example:

class Parent {
  val a = 1
  final val b = 2
}

class Subclass extends Parent {
  override val a = 3 // this line will compile
  override val b = 4 // this line will not compile
}

Also, as discussed in Why are `private val` and `private final val` different?, if a final val field is holding a "constant value", a constant primitive type, access to it will be replaced with the bytecode to load that value directly.




回答3:


You also cannot use non-final vals in (Java) annotations.

For example, this:

@GameRegistry.ObjectHolder(Reference.MOD_ID)
object ModItems{
}

will only compile if MOD_ID is declared as final.



来源:https://stackoverflow.com/questions/24911664/in-scala-difference-between-final-val-and-val

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!