Scala之旅-复合类型

Scala之旅-复合类型

复合类型(Compound Types)

有时需要将一个对象的类型表达为其它几个类型的子类型。在Scala中,这可以通过复合类型来表达,复合类型就是几个对象类型的交集。

假设我们有两个特征Cloneable和Resetable:

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

现在假设我们想要写一个函数cloneAndReset,这个函数带有一个参数对象,clones这个对象并且resets这个原始对象:

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

问题是参数obj的类型是啥。如果是Cloneable,则它可以被cloned,但是不能reset;如果是Resetable,则可以reset,但是无法进行clone操作。为了避免这种情况下进行类型转换,我们可以将obj的类型同时指定为Cloneable和Resetable。在Scala中这种复合类型记作:Cloneable with Resetable。

下面是更新后的函数:

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

复合类型可以包含多个对象类型,并且它们可能只有一个refinement,这个refinement可以用来缩窄已有对象成员的签名(Compound types can consist of several object types and they may have a single refinement which can be used to narrow the signature of existing object members.)。通用的形式是:A with B with C ... { refinement }

使用refinements的一个例子出现在抽象类型中。

参考资料

本文译自Tour Of Scala – Compound Types

上一篇:Scala之旅-抽象类型

下一篇:Scala之旅-自身类型

发表评论

电子邮件地址不会被公开。 必填项已用*标注