標籤:var 系統 實值型別 分享 傳回值 好的 泛型 number self
核心內容:
1、Scala中定義類型的兩種方式
2、Scala中的路徑依賴
3、Scala中的自身類型以及自身類型的限定
4、Scala中的依賴注入
5、Scala中的鏈式風格調用—-Type機制的用法
6、Scala中的複合資料型別
7、Scala中的抽象類別型
8、Scala中的型別參數
9、Scala中的類型約束
10、Scala中的型變、逆變、協變
11、Scala中的結構類型
在Scala當中可以用以下兩種方式定義類型:
①定義類、特質或對象
②直接用type關鍵字定義類型
在Scala當中,標註類型的時候可以直接用類和特質的名字來引用其類型,要引用對象的類型,需要用對象的type成員來引用其類型。
①在Scala當中,對象的路徑依賴不同,則其類型也不相同,路徑依賴不同,導致類型不同。
②路徑不是類型,而是類似某種位置。
①每個類本身都有一個this指標,通過this指標可以引用自身的執行個體;在自身類型當中,self不是關鍵字,是this的別名,具有更強的可讀性。
②在Scala當中,可以在類中、特質中、Object中對自身類型this進行限制約束,通過自身類型限制的方式,可以很好的限制我們的類型以及行為。
③
1、限定建立S2對象時,必須混入S1這個特質
2、S2的子類也必須混入S1 這個特質
①Scala中的依賴注入是通過自身類型限制的方式來完成的,表現為自身類型限定後,可以使用攜帶類中的屬性和方法.
②Scala中的依賴注入可以看做是Scala當中混入特質的第三種方式.
③通過Scala中的依賴注入,可以使現有的類使用攜帶類中的屬性與方法,通過隱式轉換機制可以完成同樣的功能。
執行個體1:
執行個體2:
從上面的程式可以看出隱式轉換功能的強大。
| 5、Scala中的鏈式風格調用—-Type機制的用法 |
①在Scala當中,我們之所以能做到鏈式風格的編程,是因為我們用了type機制,即所謂的單例類型的方式,將一些方法調用串聯起來.
②在Scala當中,任何類對象都有一個type屬性,這種type屬性可能返回的是類或者為對象或者為空白值。
③this.type是Scala提供的一種機制,其指向當前對象的類型。
①Scala中的複合資料型別就是通過組合其它的類型來構造的具體的類型,這種組合而成的新類型稱為複合資料型別.
②
A類型是一個複合的資料類型,既是B又是C又是D的子類型,即要求A既具有
B、又具有C、又具有D的功能。Java中的文法解讀不同於此。
①在Scala當中使用type關鍵字定義抽象類別型,所謂抽象類別型就是沒有指明具體類型的類型 .
②在Scala當中,因為有的時候型別參數文法顯得過於複雜,所以能用抽象類別型的時候盡量用抽象類別型.
樣本程式1:
樣本程式2:
①在Scala當中,型別參數是在普通參數之前用中括弧[]來定義的,然後普通參數就可以用型別參數作為參數的類型,型別參數定義的簡單方法:
②型別參數很像方法參數,只是它們是在編譯時間做的參數化.
①在Scala當中,類型變數的限定(約束)分為兩種類型:類型變數的上界與類型變數的下界。通過類型變數的限定,我們可以方便的表達出類型變數具有某些需要的特徵和方法.
②類型變數的上界定義方式:
類型變數的下界定義方式:
③在Scala當中,所有類型的最大上界是Any,最大下界是Nothing.
因為在Scala當中所有的類型都繼承自Any,而所有的類型都被Nothing繼承.
①型變指的是像T[A]這樣的高階類型的型別參數可以改變或變化的能力,型變有三種形式:不變(Invariance)、協變(Covariance)、逆變(Contravariance).協變是指把型別參數替換為其父類的能力,即妥協的變化.逆變是指把型別參數替換為其子類的能力,及逆天的變化.
②如果一個型別參數支援協變的或者逆變的,則稱這個型別參數為Variance(可變的),否則稱之為不可變的.
③可變的泛型型別並不會被子類繼承,若父類聲明為可變的,子類如果想保持可變類型,仍需要再次聲明為可變類型.
④對於函數而言,函數的參數類型是逆變的或者不變的,而函數的傳回值類型是協變的或不變的 .
⑤一般來說,當在類方法裡碰到協變和逆變的故障時,通常的解決方案是引入一個新的型別參數,即在方法簽名裡用新引入的型別參數.
①結構類型是指一組關於抽象的方法或欄位或類型的規格的說明,這些抽象的方法或欄位或類型是我們傳進來的參數必須具備的:即傳進來的參數或對象必須具備相應的抽象方法或欄位或類型。
②在Scala的結構類型當中,我們並不關心傳進來的對象的類型,我們對傳進來的參數或對象只有一個要求:即傳進來的參數或對象具有 某種行為。
如有問題,歡迎大家留言指正!
深入理解Scala中的類型系統