Scala之旅 6 复合类型(Compound Types)

有的时候需要表示一个对象的类型是其他几个类型的子类型。Scala将这种类型表示为复合类型,它是其他对象类型的交集。

假定我们有2个trait:Cloneable和Resetable:

trait Cloneable extends java.lang.Cloneable {
  override def clone(): Cloneable = { super.clone(); this }
}
trait Resetable {
  def reset: Unit
}


写一个函数接收一个对象,Clone该对象然后重置该对象:

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


问题在于不知道obj的类型,如果它是Cloneable,该对象就可以用来Clone,但不能重置。如果它是Resetable,该对象就能重置,但不能用来Clone。为了避免强制类型转换,可以指定对象obj的类型既是Cloneable又是Resetable。在Scala中,写成:Cloneable with Resetable。下面是更新后函数:

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



你可能感兴趣的:(Scala之旅 6 复合类型(Compound Types))