在下列类中使用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
的实例。