深入理解Scala中的類型系統

來源:互聯網
上載者:User

標籤: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中的結構類型

1、Scala中定義類型的兩種方式

在Scala當中可以用以下兩種方式定義類型:
①定義類、特質或對象
②直接用type關鍵字定義類型
在Scala當中,標註類型的時候可以直接用類和特質的名字來引用其類型,要引用對象的類型,需要用對象的type成員來引用其類型。

2、Scala中的路徑依賴

①在Scala當中,對象的路徑依賴不同,則其類型也不相同,路徑依賴不同,導致類型不同。
②路徑不是類型,而是類似某種位置。

3、Scala中的自身類型以及自身類型的限定

①每個類本身都有一個this指標,通過this指標可以引用自身的執行個體;在自身類型當中,self不是關鍵字,是this的別名,具有更強的可讀性。
②在Scala當中,可以在類中、特質中、Object中對自身類型this進行限制約束,通過自身類型限制的方式,可以很好的限制我們的類型以及行為。
③

1、限定建立S2對象時,必須混入S1這個特質
2、S2的子類也必須混入S1 這個特質

4、Scala中的依賴注入

①Scala中的依賴注入是通過自身類型限制的方式來完成的,表現為自身類型限定後,可以使用攜帶類中的屬性和方法.
②Scala中的依賴注入可以看做是Scala當中混入特質的第三種方式.
③通過Scala中的依賴注入,可以使現有的類使用攜帶類中的屬性與方法,通過隱式轉換機制可以完成同樣的功能。

執行個體1:

執行個體2:

從上面的程式可以看出隱式轉換功能的強大。

5、Scala中的鏈式風格調用—-Type機制的用法

①在Scala當中,我們之所以能做到鏈式風格的編程,是因為我們用了type機制,即所謂的單例類型的方式,將一些方法調用串聯起來.
②在Scala當中,任何類對象都有一個type屬性,這種type屬性可能返回的是類或者為對象或者為空白值。
③this.type是Scala提供的一種機制,其指向當前對象的類型。

6、Scala中的複合資料型別

①Scala中的複合資料型別就是通過組合其它的類型來構造的具體的類型,這種組合而成的新類型稱為複合資料型別.
②
A類型是一個複合的資料類型,既是B又是C又是D的子類型,即要求A既具有
B、又具有C、又具有D的功能。Java中的文法解讀不同於此。

7、Scala中的抽象類別型

①在Scala當中使用type關鍵字定義抽象類別型,所謂抽象類別型就是沒有指明具體類型的類型 .
②在Scala當中,因為有的時候型別參數文法顯得過於複雜,所以能用抽象類別型的時候盡量用抽象類別型.

樣本程式1:

樣本程式2:

8、Scala中的型別參數

①在Scala當中,型別參數是在普通參數之前用中括弧[]來定義的,然後普通參數就可以用型別參數作為參數的類型,型別參數定義的簡單方法:

②型別參數很像方法參數,只是它們是在編譯時間做的參數化.

9、Scala中的類型約束

①在Scala當中,類型變數的限定(約束)分為兩種類型:類型變數的上界與類型變數的下界。通過類型變數的限定,我們可以方便的表達出類型變數具有某些需要的特徵和方法.
②類型變數的上界定義方式:

類型變數的下界定義方式:

③在Scala當中,所有類型的最大上界是Any,最大下界是Nothing.
因為在Scala當中所有的類型都繼承自Any,而所有的類型都被Nothing繼承.

10、Scala中的型變、逆變和協變

①型變指的是像T[A]這樣的高階類型的型別參數可以改變或變化的能力,型變有三種形式:不變(Invariance)、協變(Covariance)、逆變(Contravariance).協變是指把型別參數替換為其父類的能力,即妥協的變化.逆變是指把型別參數替換為其子類的能力,及逆天的變化.
②如果一個型別參數支援協變的或者逆變的,則稱這個型別參數為Variance(可變的),否則稱之為不可變的.
③可變的泛型型別並不會被子類繼承,若父類聲明為可變的,子類如果想保持可變類型,仍需要再次聲明為可變類型.
④對於函數而言,函數的參數類型是逆變的或者不變的,而函數的傳回值類型是協變的或不變的 .
⑤一般來說,當在類方法裡碰到協變和逆變的故障時,通常的解決方案是引入一個新的型別參數,即在方法簽名裡用新引入的型別參數.

11、Scala中的結構類型

①結構類型是指一組關於抽象的方法或欄位或類型的規格的說明,這些抽象的方法或欄位或類型是我們傳進來的參數必須具備的:即傳進來的參數或對象必須具備相應的抽象方法或欄位或類型。
②在Scala的結構類型當中,我們並不關心傳進來的對象的類型,我們對傳進來的參數或對象只有一個要求:即傳進來的參數或對象具有 某種行為。

如有問題,歡迎大家留言指正!

深入理解Scala中的類型系統

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.