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)
  }
}

我对 trait LoggedDataAccess 中的 Logger 和 DataAccess 的初始化有点困惑。在 REPL 中,当我输入此代码时,出现以下异常:
 error: trait Logger is abstract; cannot be instantiated
       val logger = new Logger

特质真的可以像那样初始化吗?

最佳答案

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
new Test{}new Object with Test 意思相同。他们创建新的匿名类并立即实例化它。

关于scala - 在 Scala 中的 trait 中初始化 trait,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13718486/

10-10 21:39