在 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/