有这段代码:
// Initial object algebra interface for expressions: integers and addition
trait ExpAlg[E] {
def lit(x : Int) : E
def add(e1 : E, e2 : E) : E
}
// An object algebra implementing that interface (evaluation)
// The evaluation interface
trait Eval {
def eval() : Int
}
// The object algebra
trait EvalExpAlg extends ExpAlg[Eval] {
def lit(x : Int) = new Eval() {
def eval() = x
}
def add(e1 : Eval, e2 : Eval) = new Eval() {
def eval() = e1.eval() + e2.eval()
}
}
我真的想知道为什么允许trait Eval
类型与new Eval()
类似,是一个类?
答案 0 :(得分:4)
您正在实例化一个匿名类,这是一个没有名称的类:
trait ExpAlg[E] {
def lit(x : Int) : E
def add(e1 : E, e2 : E) : E
}
trait Eval {
def eval() : Int
}
val firstEval = new Eval {
override def eval(): Int = 1
}
val secondEval = new Eval {
override def eval(): Int = 2
}
现在您有两个匿名类,每个类都有eval
方法的不同实现,请注意,匿名意味着您无法实例化新的firstEval
或secondEval
。在您的特定情况下,您有一个方法总是返回一个具有该eval
方法的相同实现的匿名类。