以下类中自我类型注释的目的/含义是什么?
在第一个示例中,根本不使用自注释。派生类中是否有某些内容?
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),
答案 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
的实例。