有时需要表明一个对象的类型是其他几种类型的子类型。在 Scala 中,这可以表示成 复合类型,即多个类型的交集。

假设我们有两个特质 CloneableResetable

trait Cloneable extends java.lang.Cloneable {  override def clone(): Cloneable = {    super.clone().asInstanceOf[Cloneable]  }}trait Resetable {  def reset: Unit}

现在假设我们要编写一个方法 cloneAndReset,此方法接受一个对象,克隆它并重置原始对象:

def cloneAndReset(obj: ?): Cloneable = {  val cloned = obj.clone()  obj.reset  cloned}

这里出现一个问题,参数 obj 的类型是什么。如果类型是 Cloneable 那么参数对象可以被克隆 clone,但不能重置 reset; 如果类型是 Resetable 我们可以重置 reset 它,但却没有克隆 clone 操作。为了避免在这种情况下进行类型转换,我们可以将 obj 的类型同时指定为 CloneableResetable。这种复合类型在 Scala 中写成:Cloneable with Resetable

以下是更新后的方法:

def cloneAndReset(obj: Cloneable with Resetable): Cloneable = {}

复合类型可以由多个对象类型构成,这些对象类型可以有单个细化,用于缩短已有对象成员的签名。格式为:A with B with C ... { refinement }

关于使用细化的例子参考 通过混入(mixin)来组合类。

推荐阅读:

21.scala的抽象类型

20.scala的内部类

19.scala的类型上下界

18.scala的型变

复合类型_22.scala的复合类型相关推荐

  1. Scala的Higher-Kinded类型

    Scala的Higher-Kinded类型 Higher-Kinded从字面意思上看是更高级的分类,也就是更高一级的抽象.我们先看个例子. 如果我们要在scala中实现一个对Seq[Int]的sum方 ...

  2. Scala的存在类型

    Scala的存在类型 存在类型也叫existential type,是对类型做抽象的一种方法.可以在你不知道具体类型的情况下,就断言该类型存在. 存在类型用_来表示,你可以把它看成java中的?. 下 ...

  3. Scala的自定义类型标记

    Scala的自定义类型标记 Scala中有很多千奇百怪的符号标记,看起来是那么的独特,就像是一杯dry martini-好像黑夜中的萤火虫,那么耀眼,那么出众. 好了言归正传,这一篇文章我们会讲一下S ...

  4. scala的数值类型(三)

    Scala是一门多范式的编程语言,集成了面向对象编程和函数式编程的各种特性.其函数也能当成值来使用.Scala提供了轻量级的语法用以定义匿名函数,支持高阶函数,允许嵌套多层函数,并支持柯里化.Scal ...

  5. Scala——(常用类型与字面量,Scala类层次结构,值与变量自动类型推断,操作符,块表达式和赋值语句,输出和输出,字符串插值器,对象相等性)

    文章目录 常用类型与字面量 Scala类层次结构 值与变量&自动类型推断 操作符 块表达式和赋值语句 输出和输出 字符串插值器 对象相等性 常用类型与字面量 Scala和Java一样,有8种数 ...

  6. dotty编译器语法特性之一交叉类型,联合类型和文本单例类型

    2019独角兽企业重金招聘Python工程师标准>>> ###翻译:http://dotty.epfl.ch/docs/reference/intersection-types.ht ...

  7. Go 学习笔记(32)— 类型系统(命名类型、未命名类型、底层类型、类型强制转换、类型别名和新声明类型)

    1. 命名类型和未命名类型 1.1 命名类型 类型可以通过标识符来表示,这种类型称为命名类型( Named Type ). Go 语言的基本类型中有 20 个预声明简单类型都是命名类型, Go 语言还 ...

  8. PHP是弱类型还是强类型,php弱类型比较(松散比较) | CN-SEC 中文网

    总结一下关于php(拍h片)弱类型相关知识的梳理. 前言 php有八种类型 标量类型:整数型integer,浮点型float,字符串类型string,布尔类型boolen 复合类型:对象 object ...

  9. java不可变类型_Java中的值类型:为什么它们不可变?

    java不可变类型 值类型不必是不变的. 但是他们是. 在上一篇文章中,我讨论了Java中指针与引用之间的区别以及如何传递方法参数(按值传递或按引用传递). 这些与Java中尚不存在的值类型密切相关( ...

  10. 液滴模板水凝胶的温度控制形状变化(定制PNIPA/膨润土复合水凝胶/聚乙烯醇/魔芋胶复合凝胶/海藻酸钠(SA)/氧化石墨烯(GO)复合水凝胶/壳聚糖(CS)-g-PAM/氧化石墨烯(GO)复合水凝胶)

    作者通过设计非均匀收缩到组件中来改变整体结构的形状.亲水性聚乙二醇(PEG)基交联剂可增加PNIPAm的LCST.作者以含有MBA的液滴和含有PEGDAAm的NIPAm的液滴组成液滴对(图4a).光聚 ...

最新文章

  1. 关于VR技术和未来发展---转
  2. 更改记录表CDHDR和CDPOS
  3. 再论SAP云平台上CloudFoundry编程环境的connectivity
  4. 想要学习设计模式,你得先会看类图,一张图读懂UML
  5. 【费用流】【线性规划】志愿者招募(luogu 3980)
  6. html复选框值改变后事件,javascript – 从onclick/onchange事件获取HTML值的复选框
  7. JS_15作用域与作用域链
  8. 批量异步更新策略及 nextTick 原理
  9. 灯泡亮度控制单片机_海淀区投影机灯泡
  10. linux查看nec进程状态,【linux】 /proc/PID/stat
  11. 在Htdocs之外创建XAMPP / Apache服务文件[关闭]
  12. LeetCode Maximum Product Subarray 解题报告
  13. 自动锁定计算机快捷键,电脑自动锁屏的快捷键是什么
  14. 两个文件定义了同名的变量,会是同一个变量吗?
  15. python考试分几级_全国计算机等级考试2级分几类?到底怎么考啊?
  16. day 11 python基础语法学习 ——函数
  17. 计算机电源的功能,电源屏主要功能及工作原理
  18. request to https://registry.npmjs.org/@angular%2fcli failed, reason: read ECONNRESET
  19. 树莓派3B 之IIC通信
  20. 适配器快充方案——智融SW351X

热门文章

  1. HD 2177(威佐夫博弈 入门)
  2. 使用Visual Studio进行单元测试-Part4
  3. Scala编程实例:使用List和Tuple
  4. IOS中常见UI细节和常识
  5. 在 Delphi 下使用 DirectSound (1): 枚举播放设备
  6. 设计模式学习02-观察者模式
  7. lamp 测试mysql_搭建LAMP测试环境
  8. 逻辑卷管理和磁盘配额
  9. 前端基础--jquery
  10. Python UDP broadcast PermissionError: [Errno 13] Permission denied