为什么不能在特征中定义this-constructor?

时间:2015-11-10 23:29:14

标签: scala

我在Martin Odersky的书中读到,特质扩展了一个超类AnyRef。所以它对我来说就像是一堂课。我知道我不能在我通常在类

中使用的特性中使用默认构造函数
class B(s: String)

与此同时,我可以看到做这样的事情是不可能的

trait A {
  def this(s: String) {
    super()  
  }
}

编译说:

Error:(14, 7) 'this' expected but 'super' found.
  super()
  ^

为什么会这样?

1 个答案:

答案 0 :(得分:3)

直接来自Scala Language Specification

  

特征是一个类,它可以作为mixin添加到其他类中。与普通类不同,特征不能具有构造函数参数。此外,没有构造函数参数传递给特征的超类。这是没有必要的,因为在初始化超类之后初始化了traits。

归结为:

  1. traits归结为没有参数的java接口,这对java-interop来说很好。

  2. 虽然理论上可以允许特征具有 构造函数参数,它使语言比它更复杂 需要是。几乎可以肯定有一种方法可以实现相同的功能,而无需特征构造函数参数。