5. 抽象(Abstraction)
在组件系统中,一个重要的议题就是如何抽象所需的组件。编程语言当中有两种最主要的抽象方式:参数化和抽象成员。前一种主要是函数式抽象方式,而后一种主要是面向对象的方式。传统意义上,Java对值提供函数式抽象,而对操作提供面向对象的抽象。Java 5.0所支持的泛型,对类型也提供了一定的函数式抽象。
Scala对于值和类型提供上述两者抽象模式的统一支持,值和类型都可以作为参数,也可以作为抽象成员。本节对这两种模式进行讨论,并且对Scala类型系统的很大一部分进行回顾。
5.1. 函数式抽象(Functional Abstraction)
下面这个类定义了一个可以读取和写入数值的单元(cell):
class GenCell[T](init: T) {
private var value: T = init
def get: T = value
def set(x: T): unit = { value = x }
}
这个类用一个类型参数T抽象了cell的值的类型,因此我们称GenCell为泛型(generic)。
与类相近,方法也可以有类型参数,下面这个swap方法交换两个cell的内容,只要它们包含的值类型相同:
def swap[T](x: GenCell[T], y: GenCell[T]): unit = {
val t = x.get; x.set(y.get); y.set(t)
}
下面这段程序创建两个整数单元,并且交换它们的值:
val x: GenCell[int] = new GenCell[int](1)
val y: GenCell[int] = new GenCell[int](2)
swap[int](x, y)
参数的实际类型用方括号括起来,用于替代类和方法定义中的形式参数。Scala定义了一套复杂的类型推理(type inference)系统,使得这两种情况下参数的实际类型都可以省略。类的方法和构造函数的类型参数对应的实际类型,可以通过局部类型推理(local type inference[41, 39])根据预期的返回值以及参数类型推理出来。因此,上面的程序可以写成这种省略参数类型的方式:
val x = new GenCell(1)
val y = new GenCell(2)
swap(x, y)
分享到:
相关推荐
概述 1 scala解释器 1 scala作为脚本运行 2 scala编译运行 2 scala IDE开发环境 2 scala特点 3 数据类型 3 字符串 4 变量 4 标识符 5 操作符 5 块表达式与赋值 5 控制结构 6 函数 8 类(class)和对象(object) 14 抽象...
”本教程概述了Scala强大的类型系统及函数式编程功能如何提供一个出色的画布,以处理微服务组合及其产生的问题。我们还将重点讲述模型驱动的开发样式。微服务通常实施一个有界上下文,这是来自域驱动的设计概
内容包括: Scala语言概述、运算符、程序流程控制、数据结构之集合、Map映射、过滤、化简、折叠、扫描、拉链、视图、并行集合、高阶函数、函数柯里化、偏函数、参数推断、控制抽象、Trait、面向对象编程、异常处理、...
java容器源码与Docker的...第四章和第五章将示例Scala WebApp与Jenkins服务器结合在一起。 下一章将提供我们在Amazon Web Service上运行服务的经验。 我们在其他章节中添加了结论和未解决的问题。 作者 作者:MichaelK
RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。在 Spark 中,对数据的所有操作不外乎创建 RDD、转化已有RDD 以及...
java原始代码添加自动Java程序记录器(用Scala写) 团队成员:Abdullah Aleem和Muhammad Maaz Khan 概述 该项目是一个工具程序,它使用语法正确的Java文件,并使用Eclipse Java抽象语法树解析器来解析,重写和记录...
概述 Cats是一个库,为使用功能编程提供了抽象。 这个名字是单词类别的一个好玩的缩写。 Scala支持面向对象和功能编程,这在标准库的混合方法中得到了体现。 猫致力于提供功能性编程抽象是核心,,,和。 Cats的更...
这些是我在2014年Scala Exchange和2015年阿姆斯特丹ScalaDays上的演讲的幻灯片和代码示例。该演讲是关于使用函数式编程概念设计库代码所涉及的思维过程的入门级讨论。 概述的基本思想过程如下: 定义最小,最简单...
概述 请记住:在下面的链接中,请使用真实的AWS帐户(例如inventale dev沙箱),而不要假冒{9999999} 该项目包含Scala WeatherToParquetJob作业,以使用将数据从样本转换为镶木地板并将其存储到s3存储桶。 代码...
它旨在使扑扑/Dart开发人员可以使用两种最受欢迎的模式和抽象: Either和Option ,主要用于FP语言,例如Scala,Haskell,OCaml,... 安装 支持零安全性的预发行版本 pub上的包链接在pubspec.yaml依赖项中添加 ...
此过程称为构建eDSL(嵌入式领域特定语言)并对其进行解释,并且在功能语言(例如Haskell,Scala,OCaml)中得到了广泛使用。 尽管如此,对于许多JS / TS开发人员来说,这个主题还是一个未知数。 在本研讨会上,我...
概述 本项目的要求是: 一个检测程序,它采用一些 Java 应用程序的语法正确的源代码,并使用 Eclipse Java 抽象语法树 (AST) 解析器将此应用程序解析为 AST 对于每个作用域中的每个表达式和语句,程序将插入一个检测...