我试图在Scala中覆盖val:
var copy = [ ...myArray ]
但这拒绝编译。为什么?我想使用抽象类的值本身覆盖抽象类中的值。怎么做?
在我的特定情况下,我 无法 将其作为类参数传递。
答案 0 :(得分:4)
Scala编译器不允许在val
上使用super。如果您不关心重新评估,可以使用def
代替。
trait T{
def str: String
}
sealed abstract class Test extends T{
def str: String = "str"
}
class Test1 extends Test{
def str = super.str + "test1" //super may not be used on value str
}
defined trait T
defined class Test
defined class Test1
答案 1 :(得分:3)
如果你做关心它避免重复初始化,你可以将它提取到一个方法中:
sealed abstract class Test extends T {
lazy val str: String = initStr
protected def initStr = "str"
}
class Test1 extends Test{
override protected def initStr = super.initStr + "test1"
}
你也可以让str
非 - lazy
,但这很容易以这种方式结束初始化顺序问题。