所謂」結構類型「,指的是一組關於抽象方法、字段、類型的規格說明。java
結構類型(structural type)爲靜態語言增長了部分動態特性,使得參數類型再也不拘泥於某個已命名的類型,只要參數中包含結構中聲明的方法或值便可。舉例來講,java裏對全部定義了close方法的抽象了一個Closable
接口,而後再用Closable
類型約束參數,而scala裏能夠不要求參數必須繼承自Closable接口
只須要包含close
方法;以下:scala
scala> def free( res: {def close():Unit} ) { res.close } scala> free(new { def close()=println("closed") }) closed
也能夠經過type在定義類型時,將其聲明爲結構類型code
scala> type X = { def close():Unit } defined type alias X scala> def free(res:X) = res.close scala> free(new { def close()=println("closed") }) closed
上面傳入參數時,都是傳入一個實現close方法的匿名類,若是某個類/單例中實現了close方法,也能夠直接傳入繼承
scala> object A { def close() {println("A closed")} } scala> free(A) A closed scala> class R { def close()=print("ok") } scala> val r = new R scala> free(r) ok
結構類型還能夠用在稍微複雜一點的「複合類型」中,好比:接口
scala> trait X1; trait X2; scala> def test(x: X1 with X2 { def close():Unit } ) = x.close
上面聲明test方法參數的類型爲:it
X1 with X2 { def close():Unit }
表示參數須要符合特質X1和X2同時也要有定義close
方法。class