在 Scala 中使用匿名对象实现特征

Implements trait with an anonymous object in Scala

我有一个特征定义:

trait T {
  def name: String
}

我可以创建如下对象:

val o = new {
  val name: String = "anonymous"
} with T

但是我无法通过以下方式创建对象:

val o = new {
  def name: String = "anonymous"
} with T

编译器说 ';'或行 } with T 中的换行符 。唯一不同的是我在第二个实现中使用 def 而不是 val

我知道可以在匿名对象中定义方法,但为什么我不能在这里这样使用?

你的两个例子中的花括号是"early definitions",这里解释一下:

In Scala, what is an "early initializer"?

所以它是初始化代码,而不是混入您的对象的代码。

这个想法是在 Scala JIRA 上提出的,并以 "not a bug" 结束,这里:

https://issues.scala-lang.org/browse/SI-912