斯卡拉 - 发起一个特质?

时间:2015-01-28 12:12:24

标签: scala traits

有这段代码:

// 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()类似,是一个类?

1 个答案:

答案 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方法的不同实现,请注意,匿名意味着您无法实例化新的firstEvalsecondEval 。在您的特定情况下,您有一个方法总是返回一个具有该eval方法的相同实现的匿名类。