scala类型系统:9) this别名&自身类型
2016-11-09 09:51
120 查看
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函数式编程》
相关文章推荐
- Scala类型 9:自身类型 & this别名
- scala类型系统:11) upper bounds & lower bounds
- scala类型系统:4) 内部类,路径依赖类型&类型投影
- 【Scala类型系统】自身类型(self type)引用
- scala类型系统:3) 单例类型与this.type
- 【Scala类型系统】自身类型(self type)引用
- scala类型系统:11) upper bounds & lower bounds
- 第4集:Scala模式匹配、类型系统彻底精通与Spark源码阅读
- Scala类型 11: Upper Bounds & Lower Bounds
- C++语法基础--类(class)--类型别名,this指针,初始化式,友元的一些注意细节
- &菜鸟收藏:熟知Word箭头样式类型设置&【系统收藏】
- scala学习笔记1-泛型、界定、形变、this.type、复合类型、抽象类型
- Scala类型 6:复合类型 & with关键字
- 装XP系统时蓝屏,出现“The BIOS in this system is not fully ACPI compliant.."
- 机房收费系统之数据类型&除法运算符
- ?this&函数自身的引用
- Scala讲座:类型系统和相关功能
- SQL1005N 数据库别名 "ECM" 已存在于本地数据库目录或系统数据库目录中。
- Android启动过程 && Activity生命周期 && Activity开机自启动 && this与getBaseContext && Activity的singleTask类型
- Linux硬连接、软连接的原理 兼述磁盘组成&文件系统类型