Scala結構型別與複合型別解析

541732025發表於2016-01-21
結構型別:定義方法或者表示式時,要求傳參具有某種行為,但又不想使用類,或者介面去限制可以使用結構型別

點選(此處)摺疊或開啟

  1. class Structural { def open()=print("A class instance Opened") }

  2. object Structural__Type {

  3.   def main(args: Array[String]){
  4.     init(new { def open()=println("Opened") }) //建立了一個匿名物件,實現open方法
  5.     type X = { def open():Unit } //將右邊的表示式命名為一個別名
  6.     def init(res:X) = res.open
  7.     init(new { def open()=println("Opened again") })
  8.     
  9.     object A { def open() {println("A single object Opened")} } //建立的單例物件裡面也必須實現open方法
  10.     init(A)
  11.     
  12.     val structural = new Structural
  13.     init(structural)
  14.     
  15.   }

  16.   def init( res: {def open():Unit} ) { //要求傳進來的res物件具有open方法,不限制型別
  17.             res.open
  18.         }
  19. }

Scala複合型別解析:

點選(此處)摺疊或開啟

  1. trait Compound_Type1;
  2. trait Compound_Type2;
  3. class Compound_Type extends Compound_Type1 with Compound_Type2
  4. object Compound_Type {
  5.   def compound_Type(x: Compound_Type1 with Compound_Type2) = {println("Compound Type in global method")} //限制引數x即是Type1的型別,也是Type2的型別
  6.   def main(args: Array[String]) {
  7.     
  8.     compound_Type(new Compound_Type1 with Compound_Type2) //匿名方式,結果:Compound Type in global method
  9.     object compound_Type_oject extends Compound_Type1 with Compound_Type2 //object繼承方式,trait混入object物件中
  10.     compound_Type(compound_Type_oject) //結果都一樣,Compound Type in global method
  11.     
  12.     type compound_Type_Alias = Compound_Type1 with Compound_Type2 //定義一個type別名
  13.     def compound_Type_Local(x:compound_Type_Alias) = println("Compound Type in local method") //使用type別名進行限制
  14.     val compound_Type_Class = new Compound_Type
  15.     compound_Type_Local(compound_Type_Class) //結果:Compound Type in local method
  16.     
  17.     type Scala = Compound_Type1 with Compound_Type2 { def init():Unit } //type別名限制即是Type1,也是Type2,同時還要實現init方法
  18.   }

  19. }

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28912557/viewspace-1980424/,如需轉載,請註明出處,否則將追究法律責任。

相關文章