1. 程式人生 > 實用技巧 >scala之旅-核心語言特性【複合型別】(二十五)

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
}

問題是這個引數物件,如果它是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 }

改進方式可以檢視混合組成類中的例子。