有时要表达对象的类型是其它几种类型的子类型。在 Scala 中使用复合类型来表达,它是对象类型的交集。
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
,参数对象可以被克隆,但是不能重置;如果它实现了 Resetable
,参数对象可以被重置,但是没有克隆操作。为了避免在这种情况下的类型转换,我们可以指定 obj
的类型实现 Cloneable
和 Resetable
两个特征。在 Scala 中复合类型形如:Cloneable with Resetable
。
这里有更新之后的函数例子:
def cloneAndReset(obj: Cloneable with Resetable): Cloneable = {
//...
}
复合类型是由几种对象类型组成。它们有一个使用了已经存在的结构简单的对象成员的简单的实现。一般的形式是:A with B with C ... { refinement }
。