scala之旅-核心語言特性【複合型別】(二十五)
阿新 • • 發佈:2020-11-25
有時我們需要標註一個物件的型別是其他多個物件的子型別。在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 }
改進方式可以檢視混合組成類中的例子。