scala类型系统:9) this别名&自身类型
来源:互联网 发布:mac 10.10.5 升级 编辑:程序博客网 时间:2024/05/17 07:56
scala类型系统:9) this别名&自身类型
看scala的源码的话很发现很多源码开头都有一句:self =>
这句相当于给this
起了一个别名为self
class A { self => //this别名 val x=2 def foo = self.x + this.x }
self
不是关键字,可以用除了this
外的任何名字命名(除关键字)。就上面的代码,在A内部,可以用this
指代当前对象,也可以用self
指代,两者是等价的。
它的一个场景是用在有内部类的情况下:
class Outer { outer => val v1 = "here" class Inner { println(outer.v1) // 用outer表示外部类,相当于Outer.this }}
对于this别名 self =>
这种写法形式,是自身类型(self type)的一种特殊方式。
self
在不声明类型的情况下,只是this的别名,所以不允许用this做this的别名
scala> class C { this => } //error 不能用this做别名
但当声明了类型的时候,就不是别名的用途了,这个时候表示自身类型
,比如:
scala> class C { this:X => }
this:X =>
要求C在实例化时或定义C的子类时,必须混入指定的X
类型,这个X
类型也可以指定为当前类型
scala> class C { this:C => } // 不会报错
自身类型的存在相当于让当前类变得“抽象”了,它假设当前对象(this)也符合指定的类型,因为自身类型 this:X =>
的存在,当前类构造实例时需要同时满足X
类型
scala> new C // 不满足<console>:10: error: class C cannot be instantiated because it does not conform to its self-type C with X// ok, 相当于构造一个复合类型(C with X)的实例scala> val c = new C with X
在定义C的子类时,因为自身类型的约束,也必须满足X
类型,即子类必须也混入X
scala> class D extends C with X
注意上面两种情况下X
都为特质(trait)。
如果自身类型是定义在特质中(大多情况下):
scala> trait T { this:X => }
那么当某个class或object 要继承或混入 T 时,必须也要满足 X 类型,如果该类/单例不是X的子类的话就要同时混入X才可以
scala> object A extends T with X
最后,自身类型也可以声明为复合类型
this: X with Y with Z =>
或声明为结构类型
this: { def close:Unit} =>
另外,自身类型中,可以用this
也可以用其他名字,如self
。
转载自:http://hongjiang.info/scala/ 推荐大家阅读下这位大哥出版的书《Scala函数式编程》
0 0
- scala类型系统:9) this别名&自身类型
- Scala类型 9:自身类型 & this别名
- 【Scala类型系统】自身类型(self type)引用
- scala类型系统:3) 单例类型与this.type
- scala进阶14-自身类型self type
- Scala类型系统编程
- scala的类型系统
- scala 类型系统
- 类型别名
- 类型别名
- 类型别名
- 类型别名
- scala类型系统:1) 类型与类
- scala类型系统:5) 结构类型
- scala类型系统:7) 中缀类型
- scala类型系统:16) 函数类型
- scala类型系统:18) 不稳定(volatile)类型
- scala类型系统:20) 数组类型
- 阿里Weex框架Android平台初体验
- 四分钟制作一个美观的网页——自己留着入门用
- 算法导论之矩阵运算
- 网络爬虫项目开发日志(四):接口篇
- BSOJ:3801--隐藏指令 递推
- scala类型系统:9) this别名&自身类型
- 设计模式--观察者模式
- 假数据
- (SqlSessionTemplate和SessionFactory)sqlsession的产生过程,hibernate和mybatis的对比
- scala类型系统:10) 交集类型与联合类型
- Xcode调试断点 直接定位到出问题的位置
- scala类型系统:11) upper bounds & lower bounds
- 想要裸辞“不掉价”?方法在此!
- scala类型系统:12) view bounds-视图界定