路径依赖类型(Path-dependent types) 不知道AbsCell绑定的类型情况下,也可以对其进行访问。下面这段代码将一个cell的值恢复成为其初始值(init),而无需关心cell值的类型是什么。
def reset(c: AbsCell): unit = c.set(c.init)
为什么可以这样做呢?因为c.init的类型是c.T,而c.set是c.T=>unit类型的函数,因此形参与实参类型一致,方法调用是类型正确的。
c.T是一个路径依赖类型的例子,通常来讲,这种类型的形式是:x1.x2.….xn.T(n>0),x1,…,xn是不可变的值,而T是xn的类型成员。路径依赖类型是Scala的一个新颖的特性,其理论基础是vObj calculus[36]。
路径依赖类型要依靠其前缀路径的不可变性,下面给出一个违反了不可变性的例子:
var flip = false
def f(): AbsCell = {
flip = !flip
if (flip) new AbsCell { type T = int; val init = 1 }
else new AbsCell { type T = String; val init = "" }
}
f().set(f().get) // illegal!
在上例中,每一次调用f()分别返回int和String类型的值,因此最后一句是错误的,因为它要将String类型的值赋给一个int值的cell。Scala类型系统禁止这种调用,因为f().get的类型是f().T,而这不是一个有效类型,因为f()不是一个有效路径。
类型选择与单例类型(Type selection and singleton types)在Java中,类型定义可以嵌套,嵌套类型用其外部类型做前缀的形态表示。在Scala中,则通过“外部类型#内部类型”(Outer#Inner)的方式来表示,“#”就称作类型选择(Type Selection)。从概念上说,这与路径依赖类型(例如:p.Inner)不同,因为p是一个值,不是一个类型。进一步而言,Outer#t也是一个无效表达式,如果t是一个定义在Outer中的抽象类型的话。
实际上,路径依赖类型可以被扩展成为类型选择,p.t可以看做是p.type#t,这里p.type就称作单例类型,仅代表p所指向对象的类型。单例类型本身对于支持方法调用串接很有作用,考虑如下代码:C有一个incr方法,对其值+1,其子类D由一个decr方法,对其值-1。
class C {
protected var x = 0
def incr: this.type = { x = x + 1; this }
}
class D extends C {
def decr: this.type = { x = x - 1; this }
}
从而我们可以将相关调用串接起来:
val d = new D; d.incr.decr
如果没有this.type这个单例类型,上述调用是非法的,因为d.incr的类型应该是C,但C并没有decr方法。从这个意义上说,this.type类似于Kim Bruce的mytype[29]的一个协变的使用方式。
分享到:
相关推荐
maven-scala-plugin-2.1.jar
Scala 概述(瑞士洛桑联邦理工) Scala 概述(瑞士洛桑联邦理工)
maven-scala-plugin-2.2.jar
idea scala bin包 scala-intellij-bin-2.1.0.15.1.zip
scala-intellij-bin-2.1
techsupport_ext4_scala 由 scala & play2.1 & extjs 4.2 重建的技术支持
Algebird —Scala的抽象代数工具
自己编译 spark2.1-scala api。 自己编译 spark2.1-scala api。
【课程列表】 2.1 Scala语言概述 2.2 Scala基础 2.3 面向对象编程基础 2.4 函数式编程基础
scala是一个经典的语言,Scala代表了一个新的语言品种,它抹平了这些人为划分的界限。但是现在scala的相关学习资料不多,因此,本人总结了几篇写的较好的scala学习资料,包含<ScalaQuery_Commerzbank_2011><twitter-...
Scala概述.pptx 变量.pptx 运算符.pptx 程序流程控制.pptx 函数式编程基础.pptx 面向对象编程(基础部分).pptx 面向对象编程(中级部分).pptx 面向对象编程(高级特性).pptx 隐式转换和隐式参数.pptx 集合(上)-基本使用...
2.1 Android应用软件开发的语言 2 2.1.1 Simple 2 2.1.2 Scala 2 2.1.3 Java 2 2.2搭建开发环境 2 2.2.1 计算机配置 2 2.2.2 下载SDK初始包 3 2.2.3 安装ADT 3 2.2.4 设置Eclipse 3 2.3 ADT的使用 3 2.3.1 创建一个...
scala编程 33章 中文pdf Scala编程实战 目录 第1章字符串. 11 第2章数值39 第3章控制结构.60 第4章类和属性.103 第5章方法147 第6章对象170 第7章包和导入.190 第8章特质200 第9章函数式编程214 第10 章集合242 第...
2.2 变量声明 29 2.3 Range 31 2.4 偏函数 32 2.5 方法声明 33 2.5.1 方法默认值和命名参数列表 33 2.5.2 方法具有多个参数列表 34 2.5.3 Future简介 35 2.5.4 嵌套方法的定义与递归 38 2.6...
Programming.in.Scala.pdf
Scala 专题教程 - 抽象成员-内含源码以及设计说明书(可以自己运行复现).zip
scala-2.12.3 scala-2.12.3 scala-2.12.3 scala-2.12.3
scala 编译工具 sbt 安装包。 Little or no configuration required for simple projects Scala-based build definition that can use the full flexibility of Scala code Accurate incremental recompilation ...
此文档是讲解实战Scala,希望对喜欢大数据的同学有所帮助!!! 学习Scala语言,不仅仅意味着熟悉新的API,更重要的是一种思维方式的转变。从原有的面向对象编程(OO)到函数式编程(FP)的思想。本书面向实际的使用场景...