没有任何类/trait的纯自我类型



在下列类中使用self类型注释的目的/意义是什么?

在第一个示例中,根本没有使用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))
  }

这里是另一个例子——在这种情况下,在类中有一些self的用法——但是为什么不直接使用"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),

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

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

所以它是一个别名,可以作为一种更方便的方式来引用内部类或对象的外部实例。当你有多层内部类时,它变得更加有用。

EDIT(回答OP中的进一步例子)

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

然而,第二个例子完全显示了我最初建议的用法。这段代码:

new SparkPlanner with HiveStrategies { ... }

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

最新更新