有时候需要表达一个对象的类型是多个其他类型的子类型,在Scala中使用复合类型可以做到,这时它是多个类型的交集。
假设已有2个特质Cloneable
和Resetable
:
1 | trait Cloneable extends java.lang.Cloneable { |
现在如果我们需要写一个函数cloneAndReset
,它接受一个对象,克隆并且重置它:
1 | def cloneAndReset(obj: ?): Cloneable = { |
现在问题来了,参数obj
到底是什么类型的呢?如果是Cloneable
的,那么只能被clone
但不能reset
;如果是Resetable
的,那么却又只能reset
但不能进行clone
操作。这种情况下,为了避免类型转换,我们可以声明obj
的类型既是Cloneable
又是Resetable
。这种复合类型在Scala中写作:Cloneable with Resetable
。
下面是修改后的函数:
1 | def cloneAndReset(obj: Cloneable with Resetable): Cloneable = { |
复合类型可以包含多个对象类型,它有一种改良(refinement)可以用来缩短现有对象成员的签名。
基本形式如下:A with B with C ... { refinement }
关于改良的用法,在抽象类型一节中有案例介绍。