初始化scala中特征内的特征

sc_*_*ray 3 scala traits composition

Scala in Depth中有这样的例子:

trait Logger {
  def log(category: String, msg: String) : Unit = {
       println(msg)
  }
}

trait DataAccess {
  def query[A](in: String) : A = {
     ...
  }
}

trait LoggedDataAccess {
  val logger = new Logger
  val dao = new DataAccess

  def query[A](in: String) : A = {
     logger.log("QUERY", in)

     dao.query(in)
  }
}
Run Code Online (Sandbox Code Playgroud)

我对Traget LoggedDataAccess中Logger和DataAccess的初始化感到有些困惑.在REPL中,当我输入此代码时,我得到以下异常:

 error: trait Logger is abstract; cannot be instantiated
       val logger = new Logger
Run Code Online (Sandbox Code Playgroud)

实际上可以像这样初始化特征吗?

sen*_*nia 8

Trait无法实例化,但您可以创建trait的匿名实现实例:

scala> trait Test
defined trait Test

scala> new Test
<console>:9: error: trait Test is abstract; cannot be instantiated
              new Test
              ^

scala> new Test{}
res0: Test = $anon$1@7fafd333

scala> new Object with Test
res1: Test = $anon$1@4fe11d82
Run Code Online (Sandbox Code Playgroud)

new Test{}并且new Object with Test意思相同.他们创建新的匿名类并立即实例化它.