复合类型_22.scala的复合类型
有时需要表明一个对象的类型是其他几种类型的子类型。在 Scala 中,这可以表示成 复合类型,即多个类型的交集。
假设我们有两个特质 Cloneable
和 Resetable
:
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
的类型同时指定为 Cloneable
和 Resetable
。这种复合类型在 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的复合类型相关推荐
- Scala的Higher-Kinded类型
Scala的Higher-Kinded类型 Higher-Kinded从字面意思上看是更高级的分类,也就是更高一级的抽象.我们先看个例子. 如果我们要在scala中实现一个对Seq[Int]的sum方 ...
- Scala的存在类型
Scala的存在类型 存在类型也叫existential type,是对类型做抽象的一种方法.可以在你不知道具体类型的情况下,就断言该类型存在. 存在类型用_来表示,你可以把它看成java中的?. 下 ...
- Scala的自定义类型标记
Scala的自定义类型标记 Scala中有很多千奇百怪的符号标记,看起来是那么的独特,就像是一杯dry martini-好像黑夜中的萤火虫,那么耀眼,那么出众. 好了言归正传,这一篇文章我们会讲一下S ...
- scala的数值类型(三)
Scala是一门多范式的编程语言,集成了面向对象编程和函数式编程的各种特性.其函数也能当成值来使用.Scala提供了轻量级的语法用以定义匿名函数,支持高阶函数,允许嵌套多层函数,并支持柯里化.Scal ...
- Scala——(常用类型与字面量,Scala类层次结构,值与变量自动类型推断,操作符,块表达式和赋值语句,输出和输出,字符串插值器,对象相等性)
文章目录 常用类型与字面量 Scala类层次结构 值与变量&自动类型推断 操作符 块表达式和赋值语句 输出和输出 字符串插值器 对象相等性 常用类型与字面量 Scala和Java一样,有8种数 ...
- dotty编译器语法特性之一交叉类型,联合类型和文本单例类型
2019独角兽企业重金招聘Python工程师标准>>> ###翻译:http://dotty.epfl.ch/docs/reference/intersection-types.ht ...
- Go 学习笔记(32)— 类型系统(命名类型、未命名类型、底层类型、类型强制转换、类型别名和新声明类型)
1. 命名类型和未命名类型 1.1 命名类型 类型可以通过标识符来表示,这种类型称为命名类型( Named Type ). Go 语言的基本类型中有 20 个预声明简单类型都是命名类型, Go 语言还 ...
- PHP是弱类型还是强类型,php弱类型比较(松散比较) | CN-SEC 中文网
总结一下关于php(拍h片)弱类型相关知识的梳理. 前言 php有八种类型 标量类型:整数型integer,浮点型float,字符串类型string,布尔类型boolen 复合类型:对象 object ...
- java不可变类型_Java中的值类型:为什么它们不可变?
java不可变类型 值类型不必是不变的. 但是他们是. 在上一篇文章中,我讨论了Java中指针与引用之间的区别以及如何传递方法参数(按值传递或按引用传递). 这些与Java中尚不存在的值类型密切相关( ...
- 液滴模板水凝胶的温度控制形状变化(定制PNIPA/膨润土复合水凝胶/聚乙烯醇/魔芋胶复合凝胶/海藻酸钠(SA)/氧化石墨烯(GO)复合水凝胶/壳聚糖(CS)-g-PAM/氧化石墨烯(GO)复合水凝胶)
作者通过设计非均匀收缩到组件中来改变整体结构的形状.亲水性聚乙二醇(PEG)基交联剂可增加PNIPAm的LCST.作者以含有MBA的液滴和含有PEGDAAm的NIPAm的液滴组成液滴对(图4a).光聚 ...
最新文章
- 关于VR技术和未来发展---转
- 更改记录表CDHDR和CDPOS
- 再论SAP云平台上CloudFoundry编程环境的connectivity
- 想要学习设计模式,你得先会看类图,一张图读懂UML
- 【费用流】【线性规划】志愿者招募(luogu 3980)
- html复选框值改变后事件,javascript – 从onclick/onchange事件获取HTML值的复选框
- JS_15作用域与作用域链
- 批量异步更新策略及 nextTick 原理
- 灯泡亮度控制单片机_海淀区投影机灯泡
- linux查看nec进程状态,【linux】 /proc/PID/stat
- 在Htdocs之外创建XAMPP / Apache服务文件[关闭]
- LeetCode Maximum Product Subarray 解题报告
- 自动锁定计算机快捷键,电脑自动锁屏的快捷键是什么
- 两个文件定义了同名的变量,会是同一个变量吗?
- python考试分几级_全国计算机等级考试2级分几类?到底怎么考啊?
- day 11 python基础语法学习 ——函数
- 计算机电源的功能,电源屏主要功能及工作原理
- request to https://registry.npmjs.org/@angular%2fcli failed, reason: read ECONNRESET
- 树莓派3B 之IIC通信
- 适配器快充方案——智融SW351X