自身类型(self type)

看scala的源码的话很发现很多源码开头都有一句:self => 这句相当于给this起了一个别名为self

class Self {
    self =>   //代表this指针  ,也就是说 self 就 this的别名
    val tmp = "scala"
    def foo = self.tmp + this.tmp
}

self不是关键字,可以用除了this外的任何名字命名(除关键字)。就上面的代码,在Self 内部,可以用this指代当前对象,也可以用self指代,两者是等价的。

self type 两种使用场景

一、 用在有内部类的情况

如:

    class Outer {
      out =>
      val v1= "spark"

      class Inner {
        println(out.v1) // 用outer表示外部类,相当于Outer.this
        v1
      }
    }

二、 对子类(或者对象)的约束

trait S1

/**
 * this 不能称当别名,这里this:S1 是一个整体,就是说实例化S2时,要求S1必须混入
 */
class S2 {this:S1 =>}  // 混入trait S1,强制要求 S2的实现类 去实现 S1
class S3 extends S2 with S1

trait T {this:S1 => }
object S4 extends T with S1

this:S1 => 要求S2在实例化时或定义S2的子类时,必须混入指定的S1 类型,这个X类型也可以指定为当前类型

自身类型的存在相当于让当前类变得“抽象”了,它假设当前对象(this)也符合指定的类型,因为自身类型 this:S1 =>的存在,当前类构造实例时需要同时满足S1类型

写的不对的地方,烦请指点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值