我有这段代码:
trait base{
def msg: Unit= {
println{"base"}
}
}
trait foo extends base {
abstract override def msg: Unit ={
super.msg
println("foo")
}
}
class base2{
def msg:Unit = {
println{"base 2"}
}
}
class test extends base2 with foo{
override def msg: Unit ={
super.msg
println("done")
}
}
如果我致电(new test).msg
,则会打印出类似:base, foo, done
但是,如果我将基本特征更改为:
trait base{
def msg: Unit
}
打印出类似:base 2, foo, done
我理解with
的顺序是从右到左(最后一个是第一个),但是extends
怎么样?有时它会打印base2
,但有时会base
?
答案 0 :(得分:1)
当您省略实施时,base
是特质的模板,并且具有不同的评估规则。请参阅Scala specification
答案 1 :(得分:1)
Scala有一种称为类型线性化的东西。它定义了初始化顺序。阅读http://eed3si9n.com/constraining-class-linearization-in-Scala