自身类型的第一个用途:
class Self {
self => //self是this的别名,每个类都有个this指针,指向自己的实例。可以用除了this的其他任何名字。
val tmp = "scala"
def foo = self.tmp + this.tmp
}
object Self_Types_56 {
def main(args: Array[String]): Unit = {
//自身类型的用途
class Outer{ outer => //相当于Outer.this
val v1 = "Spark"
class Inner{
println(outer.v1) //在内部类使用外部类的属性/方法,在内部类做引用是很方便的
}
}
}
}
自身类型的第二个用途:
trait S1
class S2 { this : S1 => } //这时,自身类型就有了额外的限定条件:在S2实例化时,必须混入指定的类型S1。用自身类型把当前的S2抽象化了,S2必须符合S1的类型。
//也可按照结构类型,要求当前self type具有什么样的行为,对其进行限制
class S3 extends S2 with S1 //若自身类型有约束的话,那么它的子类也必须满足约束条件
trait T { this : S1 =>} //在trait中定义自身类型,若trait T想构建实例,必须混入S1
object S4 extends T with S1
object Self_Types_56 {
def main(args: Array[String]): Unit = {
val c = new S2 with S1
}
}
参考资料来源于大数据梦工厂 深入浅出scala 第56讲 由王家林老师讲解