没有任何阶级/特质的裸自我类型

时间:2014-07-26 19:33:24

标签: scala self

以下类中自我类型注释的目的/含义是什么?

在第一个示例中,根本不使用自注释。派生类中是否有某些内容?

  abstract class StrippingTruncatingWriter(out: JPrintWriter)
          extends JPrintWriter(out)
             with StrippingWriter
             with TruncatingWriter {
    self =>

    def clean(str: String): String = truncate(strip(str))
    override def write(str: String) = super.write(clean(str))
  }

这是另一个例子 - 在这种情况下,在课堂上有一些自我的用法 - 但为什么不只是使用“this”呢?

class HiveContext(sc: SparkContext) extends SQLContext(sc) {
  self =>
  // Here is how the self type annotation is used within the class:

  val hivePlanner = new SparkPlanner with HiveStrategies {
    val hiveContext = self

    override val strategies: Seq[Strategy] = Seq(
      CommandStrategy(self),
      HiveCommandStrategy(self),

1 个答案:

答案 0 :(得分:4)

一开始似乎多余,但是当涉及内部类或对象时它可以派上用场。比较以下两个片段:

class SomeClassWithPossiblyVeryLongName {
  class SomeInnerClass {
    def outerInstance = SomeClassWithPossiblyVeryLongName.this
  }
}

class SomeClassWithPossiblyVeryLongName { self =>
  class SomeInnerClass {
    def outerInstance = self
  }
}

所以它是一个别名,可以简单地用作引用内部类或对象的外部实例的更方便的方法。当你有多个级别的内部类时,它会变得更有用。

编辑(回答OP的其他例子)

第一个示例中的self标识符(抽象类)是多余的,并且不做任何事情。

但是,第二个示例显示了我最初提出的用法。这段代码:

new SparkPlanner with HiveStrategies { ... }

创建一个匿名内部类。因此,如果您按照建议将self替换为this,则会得到不同的内容,因为在匿名内部类中,this指的是匿名内部类的实例,而{{1} }}是指self的实例。